C#通过webbrowser控件与javascript交互
1.C#里调用控件里面网页的js函数
// 调用JavaScript的messageBox方法,并传入参数 object[] objects = new object[1]; objects[0] = “C#访问JavaScript脚本”;
this.webBrowser1.Document.InvokeScript(“messageBox”, objects);
//object就是传入的参数,而messageBox则是网页中预定义好的js函数。
通过这种方式C#里面就可以执行Javascript函数,可以把上面的代码放到一个button的click事件里面。
2.C#windows窗体应用webbrowser控件里网页js调用C#窗体的函数
首先需要在代码里面加上
[System.Runtime.InteropServices.ComVisibleAttribute(true)] public partial class Form1 : Form
{
…..//
}
这样使得C#的com对象是对网页里的javascript可见的。
然后在嵌入网页里面通过“window.external.MyMessageBox(‘javascript访问C#代码’)” ,即通过window.external捕获调用c#定义好的函数。
具体Form.cs代码如下(通过vs2008创建的c#window窗体应用,拖拽上一个webbrowser控件和button控件。):
[System.Runtime.InteropServices.ComVisibleAttribute(true)] public partial class Form1 : Form { public Form1() { InitializeComponent(); System.IO.FileInfo file = new System.IO.FileInfo(“test.html”); // WebBrowser控件显示的网页路径 this.webBrowser1.Url = new Uri(file.FullName); // 将当前类设置为可由脚本访问 this.webBrowser1.ObjectForScripting =this;
}
private void button1_Click(object sender, EventArgs e) {
} // 提供给JavaScript调用的方法 public void MyMessageBox(string message) { MessageBox.Show(message); }
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
}
private void button1_Click_1(object sender, EventArgs e) { // 调用JavaScript的messageBox方法,并传入参数 object[] objects = new object[1]; objects[0] = “C#访问JavaScript脚本”; this.webBrowser1.Document.InvokeScript(“messageBox”, objects); } }
test.html内容比较简单:
javascript访问C#代码
配置运行成功的话,可以看到相互调用的效果,希望对需要的童鞋有用!
补充一个js调用C#函数的方法:
1,设置脚本对象:
wb.ObjectForScripting = this; // wb为Webbrowser对象 2,公开方法 public void Alert() { MessageBox.Show("dkkfdkf"); } 3,然后页面上用javascript可以调用这个方法 external.Alert();
看了高人的博客,再补充几个,哈:
Winform WebBrowser控件对访问页面执行、改写、添加Javascript代码
大家有兴趣可以加我QQ群交流:14792063 广州软件开发团队
使用Winform WebBrowser控件对访问页面执行、改写、添加Javascript代码,可以解决许多问题,实现你想要的效果。
可以通过引用Microsoft.mshtml,实现对Javascript的操作,代码如下:
代码
mshtml.IHTMLDocument2 doc
=
webBrowser1.Document.DomDocument
as
mshtml.IHTMLDocument2; mshtml.IHTMLWindow2 win
=
doc.parentWindow
as
mshtml.IHTMLWindow2; win.execScript(
@"
alert('hello webbrowser')
"
,
"
javascript
"
);
其实还有一种更好的、无需引用Microsoft.mshtml的实现方式:
代码
HtmlElement ele
=
webBrowser1.Document.CreateElement(
"
script
"
); ele.SetAttribute(
"
type
"
,
"
text/javascript
"
); ele.SetAttribute(
"
text
"
,
"
alert('hello webbrowser')
"
); webBrowser1.Document.Body.AppendChild(ele);
这种使用.Net框架本身所提供的对象,相比引用框架外的COM,好处是显而易见的,这将更方便于安装部署至客户机上。
执行上述两段代码的效果是一样的,都将弹出网页对话框“hello webbrowser”。如果仅是执行Javascript方法,那么,有更简单的且可获得方法返回值的方式,首先假如页面上有如下Javascript方法:
function sayHello(to) { alert(
'
hello
'
+
to);
return
'
hi, i am javascript
'
; }
在Winform中执行以下代码,首先会弹出网页对话框“hello webbrowser”,然后是Winform的MessageBox对话框“hi, i am javascript”
MessageBox.Show(webBrowser1.Document.InvokeScript( " sayHello " , new object []{ " webbrowser " }).ToString());
Winform WebBrowser控件是一个好东西,它不但可以导航网页,还可以使用它获取一些在客户端浏览器HTML源代码中无法获取的数据。如使用了AJAX获取数据的页面,通过客户端浏览器查看源代码的方式,将无法获取到这部分的数据;又如使用了Javascript对内容进行加密以防止采集的页面,即使让你获得HTML源代码,也难以解密得到你想要的结果。但WebBrowser使得这一切变得简单!有兴趣的朋友欢迎继续阅读本博的另一篇文章《》,讲述如何通过WebBrowser访问加密页面,改写其中的Javascirpt方法获取加密的结果。