一 使用c#的WebBroswer控件
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")
2 在 WebKit(Cefsharp)使用
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);
ie控件浏览器与网页交互(csExWB)
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来执行
TWebBrowser 与 MSHTML(5): document 对象的属性、方法、事件纵览
{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 前