赞
踩
1 在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类可以com组件的形式供外包调用
- [ComVisible(true)]
- public partial class WebBrowserForm{
- }
2 使用pubilc公开方法提供js调用
- public void xmpf(string name)
- {
-
- messageBox.Show(name);
-
- }
3 在类的构造函数里加载页面代码
(1)调用对象类是本身类
- public WebBrowserForm()
- {
- InitializeComponent();
- string pathName = Application.StartupPath + "\\" + "test.html";
- this.webBrowser2.ObjectForScripting = this;
- webBrowser2.Navigate(pathName);
- }
(2)调用对象类是其他类
- [System.Runtime.InteropServices.ComVisibleAttribute(true)]
- class myClass
- {
- public void xmpf()
- {
- System.Windows.Forms.MessageBox.Show("alert:Test");
- }
- }
-
- public WebBrowserForm()
- {
- this.webBrowser2.ObjectForScripting = new myClass();
- }
(3)使用将具体属性加入 Reflection 物件。直接把扩展js属性加入
- private void jsExtension(mshtml.HTMLDocument doc)
- {
- IExpando windowEx = (IExpando)doc.parentWindow;
- PropertyInfo MyExtension = windowEx.GetProperty("myExtension", BindingFlags.Default);
- if (MyExtension == null)
- {
- MyExtension = windowEx.AddProperty("myExtension");
- MyExtension.SetValue(windowEx, this, null);
- }
- }
4 使用js调用
window.external.xmpf(obj.name,obj.value, obj.checked);
或者
window.top.myExtension.Submit();
总结: 1 使用[ComVisible(true)]标记类对com组件可见
2 使用WebBrowser的ObjectForScripting类引用此类
在c#WebBroswer调用网页本身js
webBrowser1.Document.InvokeScript("jsAlert ", new string[] {‘ssss’});
在c#WebBroswer调用添加本身js
- IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;
- win.execScript(strScript, "Javascript")
1暴露的.NET类为Javascript
- public class BoundObject
- {
- public void MyMethod() { }
- }
- //browser表示你的CefSharp对象使用它的RegisterJsObject来绑定你的.net类
- browser.RegisterJsObject("bound", new BoundObject());
- //在实际的JS代码中,你将使用这样的对象:
- bound.myMethod(); // 使用此调用方法。
1.基本的同(异)步js操作
- browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid').click();");
- browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid2').value='123'");
2.其他Frame操作
- string script = "if(document.getElementById('img_out_10000')){ document.getElementById('img_out_10000').click(); }";
- var list = browser.GetBrowser().GetFrameNames();
- if (list.Count > 1)
- {
- browser.GetBrowser().GetFrame(list[1]).ExecuteJavaScriptAsync(script);
- }
3.如何调用Javascript方法返回的结果呢?
如果您需要评估代码,返回一个值,使用Task EvaluateScriptAsync(string script, TimeSpan? timeout)方法。 JavaScript代码是异步执行的,因此使用.NET Task类返回一个响应,其中包含错误消息,结果和一个成功(布尔)标志。
- // Get Document Height
- var task = frame.EvaluateScriptAsync("(function() { var body = document.body, html = document.documentElement;
- return Math.max( body.scrollHeight, body.offsetHeight,
- html.clientHeight, html.scrollHeight, html.offsetHeight ); })();", null);
- task.ContinueWith(t =>
- {
- if (!t.IsFaulted)
- {
- var response = t.Result;
- EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
- }
- }, TaskScheduler.FromCurrentSynchronizationContext());
总结:
1 保留.net类为js,把需要暴露的对象传入ChromiumWebBrowser类的RegisterJsObject方法即可。
2 使用异步,把字符串传入GetBrowser().MainFrame.ExecuteJavaScriptAsync()方法;
3 frame操作,GetFrameNames获取所有frame,获取单个GetFrame,ExecuteJavaScriptAsync()执行异步
4 获取结果 ,先用task接收EvaluateScriptAsync(str,null)返回结果,然后执行ContinueWith方法获取结果,传入t参数,Result就是返回值
可以在页面加载完之后执行所需方法绑定js
LoadingStateChanged页面加载完执行方法
- webBrowser.LoadingStateChanged += WebBrowser_LoadingStateChanged;
- private void WebBrowser_LoadingStateChanged(object sender, CefSharp.LoadingStateChangedEventArgs e){
- e.Browser.MainFrame.EvaluateScriptAsync(@"");
- }
1 把谷歌内核浏览器插件添加到当前控件集
- webBrowser = new ChromiumWebBrowser(url);
- webBrowser.Dock = DockStyle.Fill;//填充方式
- this.Controls.Add(webBrowser);
doucument操作
5 没有id,name,可以直接通过标签获取元素
- var bxtxtable = document.getElementById('query').getElementsByTagName('table')[1];
- var trs = bxtxtable.rows;
- var l = trs.length;
- if (l < 1) {
- return;
- }
- for (var i = 0; i < l; i++) {
- var tr = trs[i];
- var td = tr.cells[0]
-
- }
- }
扩展:
SynchronizationContextTaskScheduler
这是一个同步上下文的taskscheduler,原理就是把繁重的耗时工作丢给ThreadPool,然后将更新UI的操作丢给 UI线程的队列中,由UIThread来执行
- {IHTMLDocument2 方法:}
- write //写入
- writeln //写入并换行
- open //打开一个流,以收集 document.write 或 document.writeln 的输出
- close //关闭并输出用 document.open 方法打开的流
- clear //清空文档中所有元素, 可能暂时不支持
- queryCommandSupported //是否支持指定命令
- queryCommandEnabled //指定命令是否有效
- queryCommandState //是否设置了指定命令
- queryCommandIndeterm //指定命令是否处于不确定状态
- queryCommandText //命令
- queryCommandValue //命令值
- execCommand //执行命令
- execCommandShowHelp //命令帮助信息
- createElement //建立元素
- elementFromPoint //指定坐标下的元素
- createStyleSheet //创建一个样式表
-
- {IHTMLDocument2 属性:}
- all //所有 HTML 元素的集合
- images //所有 image 对象的集合
- applets //所有 applet 对象的集合
- links //所有 link 对象的集合
- forms //所有 form 对象的集合
- anchors //所有 anchor 对象的集合
- scripts //所有 script 对象的集合
- frames //所有 frame 对象的集合, 这应该和 window.frames 是一样的
- embeds //所有 embed 对象的集合
- plugins //所有 plugin 对象的集合
- styleSheets //样式表集合
- title //网页标题
- body //body 对象
- activeElement //当前具有输入焦点的元素
- designMode //设计模式, 可选值: Inherit On Off
- selection //当前选择
- readyState //页面读取状态: uninitialized、loading、loaded、interactive、completed
- linkColor //链接的颜色
- alinkColor //活动链接的颜色
- vlinkColor //已访问过的链接的颜色
- bgColor //背景颜色
- fgColor //文本颜色
- referrer //返回载入当前页面的页面的 URL
- location //同 window.location
- lastModified //返回文档最后修改的日期和时间
- url //返回当前文档的 URL
- domain //返回域名
- cookie //返回文档相关的 cookie
- expando //可设置与获取的布尔值, 是否允许扩展
- charset //获取文档的字符集名称
- defaultCharset //获取浏览器默认的字符集名称
- mimeType //文档类型
- fileSize //文档大小, 单位字节, 用字符串表示
- fileCreatedDate //文档建立时间 ???
- fileModifiedDate //文档修改时间 ???
- fileUpdatedDate //文档更新时间 ???
- security //文档安全
- protocol //传输协议
- nameProp //文件标题, 好像同 Title
- parentWindow //父窗口
- Script //
-
- {IHTMLDocument2 事件:}
- onhelp //用 F1 获取帮助时
- onclick //单击时
- ondblclick //双击时
- onmousedown //鼠标点下时
- onmouseup //鼠标抬起时
- onmousemove //鼠标移动时
- onmouseover //鼠标进入时
- onmouseout //鼠标离开时
- onkeypress //按键时
- onkeyup //键按住时
- onkeydown //键抬起时
- onreadystatechange //状态改变时
- onrowexit //当前数据源的数据将要发生变化时
- onrowenter //当前数据源的数据发生变化并且有新的数据时
- ondragstart //开始拖动时
- onselectstart //开始选择时
- onbeforeupdate //更新前
- onafterupdate //更新后
- onerrorupdate //更新错误时
-
-
- {IHTMLDocument3 方法:}
- recalc //重新获取文档中的全部动态属性
- releaseCapture //释放文档中对象的鼠标捕捉
-
- {IHTMLDocument3 属性:}
- createTextNode //建立文本
- attachEvent //绑定事件
- detachEvent //取消事件绑定
- createDocumentFragment//创建新文档
- getElementsByName //返回带有指定 name 的对象集合
- getElementById //返回指定 id 的第一个对象的引用
- getElementsByTagName //返回指定标签的对象集合
- documentElement //获取文档根部节点, 也就是 HTML 节点
- uniqueID //获取对象的唯一标识符
- dir //
- parentDocument //
- enableDownload
- baseUrl //基础地址
-
- {IHTMLDocument3 事件:}
- onrowsdelete //当前数据记录被删除时
- onrowsinserted //当前数据源将要插入新数据时
- oncellchange //当数据来源发生变化时
- ondatasetchanged //数据源发生变化时
- ondataavailable //当数据接收完成时
- ondatasetcomplete //当数据源的全部有效数据读取完毕时
- onpropertychange //改变属性时
- oncontextmenu //当按下鼠标右键出现菜单或通过键盘触发页面菜单时
- onstop //停止或离开时
-
-
- {IHTMLDocument4 方法:}
- focus //获得输入焦点
- hasFocus //是否拥有输入焦点
- createDocumentFromUrl //下载指定网页并返回其 IHTMLDocument2 接口
- CreateEventObject //生成当使用 fireEvent 方法时用于传递事件相关信息的 event 对象 ???
- FireEvent
-
- {IHTMLDocument4 属性:}
- createRenderStyle //建立 IHTMLRenderStyle 接口
- namespaces //
- media //
- URLUnencoded //获取去除字符编码的 URL
-
- {IHTMLDocument4 事件:}
- onselectionchange //改变选择时
- oncontrolselect //好像是框选时
-
-
- {IHTMLDocument5 方法:}
- createAttribute //建立指定 name 的属性
- createComment //建立注释
-
- {IHTMLDocument5 属性:}
- doctype //文档类型
- implementation_ //获取 IHTMLDOMImplementation 接口
- compatMode //兼容模式, 返回 BackCompat、CSS1Compat 等
-
- {IHTMLDocument5 事件:}
- onmousewheel //旋转鼠标滚动轮时
- onfocusin //获取输入焦点时
- onfocusout //失去输入焦点时
- onactivate //激活时
- ondeactivate //当前对象变为父文档的其他对象时
- onbeforeactivate //onactivate 前
- onbeforedeactivate //ondeactivate 前

参考文献:
https://blog.csdn.net/u010085423/article/details/72765971
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。