从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 版权协议,转载请附上原文出处链接和本声明。
