winfrom内嵌浏览器----火狐内核--网站中点击事件没反应,BS/CS交互报COM组件调用错误问题 的看过来
一. 点击事件没反应
前两天老大安排我做winfrom里内嵌浏览器控件,一开始我准备用自带的IE的Webbrowser,和谷歌的webKit内核
然后自己试了一下,由于网站的限制,我IE和谷歌的CSS效果没那么好,后来还是选择了火狐
由于网站是使用的EXT框架,里面的所有按钮都点击不了,但是原生的html按钮的onclick和jq的$(“#id”).on('click',function(){ }) 这样就可以实现点击,EXT的点击事件是handler或listen{'click':function(){}} 这样的绑定的事件,不能实现点击事件,当时一度没思路,在网上找不到解决方案快要放弃
后来灵机一动,自己干脆写了个demo,测试下jq框架下的元素和ext框架下元素有什么不同的地方
如图:这是在浏览器下测试的两个按钮绑定的监听事件列表
Jq下的h5按钮只有一个click,ext有很多监听事件,我调试的结果是ext点击按钮的时候进了touchstart,这个我不知道为什么
然后我再在winfrom里面运行了这两个网站
如图:
这里可以看到在winfrom框架里面touch事件全是undefined,这我就知道是怎么回事了,我们来看下ext-all的源码,在源码的2W多行的位置,有这么个判断
如图:
EXT.WebKit,我调试了一下,在winfrom的浏览器里面,这个地方是false,所以没有绑定事件,原因就是在这里
解决方案一 就是手动把Ext.WebKit的值改成true,这个地方不会对其他的地方造成影响,暂时没发现对别的地方有什么影响
解决方案二 就是用geckoWebBrowser 45.0版本的 这个我也测了,不用改源码就可以,但是我目前是用的geckoWebBrowser 33.0版本的
二.C#调js方法,js调C#方法 Com组件调用错误的解决方案
js调C#方法可以调用geckoWebBrowser控件里的DomClick事件,这个事件有个参数e,e就是点击的元素 element
C#调js方法或对象这个会影响Com组件调用错误
var executor = new Gecko.JQuery.JQueryExecutor(geckoWebBrowser1.Window); //先获取到jquery对象
var c = executor.ExecuteJQuery("json").ToObject();//取到js中名为json的全局变量
这个地方如果报Com组件错误,原因可能如下
1.本地DTC服务没开,或者DTC的出入站规则限制,我设置的是允许出入站,不需要验证
2.防火墙的出入站设置,我也设置的允许
我这样设置之后,然后重启一下机器重现调试,就可以在CS端获取到BS端的对象变量和方法了
在CS调js的方法如下
var js = "test1(1)";//调js中的test1传个参数
geckoWebBrowser1.Navigate(string.Format("javascript:void({0})", js));
就可以了,完美~
一方面给做相关事情的程序员提点方向,因为网上这方面的资料实在太少了,基本上可以说没有
第二个是给自己做个笔记,别让以后给忘了
祝各位大佬们编码顺利