【发布时间】:2014-06-18 22:56:49
【问题描述】:
我刚刚学习C# WPF,已经成功实现了CefSharp,如何从CefSharp中加载的javascript调用.NET函数?
【问题讨论】:
标签: javascript c# cefsharp
我刚刚学习C# WPF,已经成功实现了CefSharp,如何从CefSharp中加载的javascript调用.NET函数?
【问题讨论】:
标签: javascript c# cefsharp
示例如下:
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 方法的第一个字符不能在上面
【讨论】:
Cef.RegisterJsObject
首先在 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);}
【讨论】:
由于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?
【讨论】: