从cefsharp79版本开始,旧的
RegisterJsObject
方法被删除了。
也就是说想使用79以后的版本,就必须更新js暴露c#对象的方法了。话不多说直接上代码:
BindingOptions bindingOption = new BindingOptions {
CamelCaseJavascriptNames = false,
Binder = BindingOptions.DefaultBinder.Binder };
CWBrowser.JavascriptObjectRepository.Register("cefCardReader", new CefCardReader(), false);
首先在创建了ChromiumWebBrowser实例之后,要注册对象,这一步和之前没什么大的变化,只是注册方法改了一下。但是如果你以为这样注册一下就能和之前一样使用那你就太天真了。
现在你注册之后,要想在js中使用cefCardReader中的方法,在使用之前你需要这样:
CefSharp.BindObjectAsync('cefCardReader');
cefCardReader.add();
我为了省掉这一步我会在Frame加载完成之后,这样做:
/// <summary>
/// 加载结束事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void CWBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
StringBuilder sb = new StringBuilder();
sb.Append("(function(){")
.Append("CefSharp.BindObjectAsync('cefCardReader');")
.Append("})();");
browser.GetFocusedFrame().EvaluateScriptAsync(sb.ToString());
}
这里面又有一个要注意的地方,这个
CefSharp.BindObjectAsync
在你每新开一个标签页的时候都需要重新调用一次,这就是我为什么把它放在FrameLoadEnd的中执行的原因。
最后在说一下,新注册方法的问题,由于Frame加载回调并不能保证页面的js方法都还没有执行,所以会导致一些在页面加载过程中就开始执行的js方法如果调用了
cefCardReader
的方法会失败。而解决方法就是在调用之前调用
CefSharp.BindObjectAsync('cefCardReader');
版权声明:本文为wf2397108372原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。