从 CefSharp 1 中的 javascript 调用 .Net - wpf

Posted

技术标签:

【中文标题】从 CefSharp 1 中的 javascript 调用 .Net - wpf【英文标题】:Call .Net from javascript in CefSharp 1 - wpf 【发布时间】:2014-06-18 22:56:49 【问题描述】:

我刚刚学习C# WPF,已经成功实现了CefSharp,如何从CefSharp中加载的javascript调用.NET函数?

【问题讨论】:

【参考方案1】:
    通过 WebView 构造 WebView webView = new WebView(url) 然后就可以调用RegisterJsObject方法注册一个js对象了。 使用javascript调用这个js对象。

示例如下:

public class CallbackObjectForJs
    public void showMessage(string msg)//Read Note
        MessageBox.Show(msg);
    


WebView webView = new WebView("http://localhost:8080");
webView.RegisterJsObject("callbackObj", new CallbackObjectForJs());

前端的javascript代码:

<script type="text/javascript">
    callbackObj.showMessage('message from js');
</script >

注意:CallbackObjectForJs 的 showMessage 方法的第一个字符不能在上面

【讨论】:

未实现 CefSharp 33.0.0 中发生异常。任何人都知道这可能何时实施。下一个版本? @CaptainBli 现在好像已移至Cef.RegisterJsObject【参考方案2】:

首先在 C# 中创建一个公共类,如下所示:

public class cShaarp_Js

public void calledFromJs(Object object)

然后你应该将这个类注册到你的 chromeBrowser。

chromeBrowser = new ChromiumWebBrowser("file:///C:/sample.html");
chromeBrowser.RegisterJsObject("csharp", new cShaarp_Js);

现在我们完成了 C#。在 javascript 的另一边,你可以创建一个回调到这个类,如下所示:

function cSharpMetodCall()csharp.calledFromJs(object);

【讨论】:

【参考方案3】:

由于Chromium 更改以63.0.0 开头,因此Javascript Binding 发生了重大更改。旧行为仍然适用于 Single Page Applications 并且仅使用单个域。

新的绑定方法

新的绑定方式有很多优点:

按名称绑定和取消绑定对象 将对象子集绑定到不同的页面(包括弹出窗口) 删除/取消绑定方法 动态解析绑定对象

简单示例:

public class BoundObject 
    public void showMessage(string msg) 
        MessageBox.Show(msg);
    


browser.JavascriptObjectRepository.Register("boundAsync", new BoundObject(), true);

<script type="text/javascript">
    (async function() 
        await CefSharp.BindObjectAsync("boundAsync", "bound");

        boundAsync.showMessage('Message from JS');
    )();
</script>

更多详情请访问Javascript Binding v2 #2246和How do you expose a .NET class to JavaScript?

旧版绑定

如果您执行跨站点导航,您将无法再使用此方法绑定对象。

您需要在注册第一个对象 (RegisterAsyncJsObject) 之前设置 CefSharpSettings.LegacyJavascriptBindingEnabled = true

简单示例:

public class BoundObject 
    public void showMessage(string msg) 
        MessageBox.Show(msg);
    


CefSharpSettings.LegacyJavascriptBindingEnabled = true;
browser.RegisterAsyncJsObject("boundAsync", new BoundAsyncObject());

<script type="text/javascript">
    boundAsync.showMessage('Message from JS');
</script>

更多详情请访问Javascript Binding v2 #2246和How do you expose a .NET class to JavaScript?

【讨论】:

“新绑定方法”部分的绝佳答案。简单,晶莹剔透,像魅力一样工作:)

以上是关于从 CefSharp 1 中的 javascript 调用 .Net - wpf的主要内容,如果未能解决你的问题,请参考以下文章

CefSharp LoadHtml

WinForms 中的 CefSharp - ExecuteScriptAsync 或 EvaluateScriptAsync 不起作用

从 CefSharp 网络浏览器获取 HTML 源代码

Cefsharp 清除 wpf 中的缓存、cookie 和浏览器数据

将 CefSharp 依赖项放入特定目录

公用的cefsharp窗口