zoukankan      html  css  js  c++  java
  • C#通过webbrowser控件与javascript交互

    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内容比较简单:

    <html>
    <head>
    <meta http-equiv=”Content-Language” content=”zh-cn”>
    <script language=”javascript” type=”text/javascript”>
    <!– 提供给C#程序调用的方法 –>
    function messageBox(message)
    {
    alert(message);
    }
    </script>
    </head>
    <body>
    <!– 调用C#方法 –>
    <button οnclick=”window.external.MyMessageBox(‘javascript访问C#代码’)” >
    javascript访问C#代码</button>
    </body>
    </html>

    配置运行成功的话,可以看到相互调用的效果,希望对需要的童鞋有用!

    补充一个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方法获取加密的结果。
    ————————————————
    版权声明:本文为CSDN博主「luxiaoyu_sdc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/luxiaoyu_sdc/article/details/6896451

  • 相关阅读:
    hdu 5916
    hdu 5918
    hdu 5914 Triangle
    hdu 5912Fraction
    遗传算法初学习
    hdu 5873 Football Games
    JAVA 定时器的三种方法
    java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~
    Eclipse设置Tab键缩进4个空格的步骤,也就是按一下Tab键输出四个空格
    Nginx 相关介绍(Nginx是什么?能干嘛?个人觉得写得比较好的文章,转载过来)
  • 原文地址:https://www.cnblogs.com/bdqczhl/p/12992265.html
Copyright © 2011-2022 走看看