• C#的WEBBROWSER与JS交互的方法(转载)


    原地址:http://www.jb51.net/article/57574.htm

    本文实例总结了C#的WEBBROWSER与JS交互的方法。分享给大家供大家参考。具体实现方法如下:

    一、实现WebBrowser内部跳转,阻止默认打开IE

    1、引用封装好的WebBrowserLinkSelf.dll实现

    复制代码代码如下:
    public partial class MainWindow : Window
    {
           private WebBrowser webBrowser = new WebBrowser();
     
           public MainWindow()
           {
               InitializeComponent();
     
                this.webBrowser.LoadCompleted += new LoadCompletedEventHandler(webBrowser_LoadCompleted);
     
               //使webbrowser寄宿于Label上,实现webborwser内部跳转,不用IE打开
               Label lb = new Label { Content = webBrowser };
               WebBrowserHelper webBrowserHelper = new WebBrowserHelper(webBrowser);
               HelperRegistery.SetHelperInstance(lb, webBrowserHelper);
               webBrowserHelper.NewWindow += WebBrowserOnNewWindow;
               this.lbBrowserHost.Content = lb;
     
               // this.webBrowser.Navigate(new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute));
           }
     
           private void WebBrowserOnNewWindow(object sender, CancelEventArgs e)
           {
               dynamic browser = sender;
               dynamic activeElement = browser.Document.activeElement;
               var link = activeElement.ToString();
               this.webBrowser.Navigate(new Uri(link, UriKind.RelativeOrAbsolute));
               e.Cancel = true;
           }
    }

    2、引用com:Microsoft Internet Controls实现(参考MSDN:http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.aspx public partial class MainWindow : Window

    复制代码代码如下:
    <em id="__mceDel">    {
            public MainWindow()
            {
                InitializeComponent();
                this.webBrowser1.Navigate(new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute));
                this.webBrowser1.LoadCompleted += new LoadCompletedEventHandler(webBrowser1_LoadCompleted);
     
            }
            private IServiceProvider serviceProvider;
            void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
            {
                if (this.serviceProvider == null)
                {
                    serviceProvider = (IServiceProvider)webBrowser1.Document;
                    if (serviceProvider != null)
                    {
                        Guid serviceGuid = new Guid("0002DF05-0000-0000-C000-000000000046");
                        Guid iid = typeof(SHDocVw.WebBrowser).GUID;
                        var webBrowserPtr = (SHDocVw.WebBrowser)serviceProvider
                            .QueryService(ref serviceGuid, ref iid);
                        if (webBrowserPtr != null)
                        {
                            webBrowserPtr.NewWindow2 += webBrowser1_NewWindow2;
                        }
                    }
                }
            }
     
            private void webBrowser1_NewWindow2(ref object ppDisp, ref bool Cancel)
            {
                dynamic browser = this.webBrowser1;
                dynamic activeElement = browser.Document.activeElement;
                var link = activeElement.ToString();
                this.webBrowser1.Navigate(new Uri(link, UriKind.RelativeOrAbsolute));
                Cancel = true;
            }
     
            [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
            [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
            internal interface IServiceProvider
            {
                [return: MarshalAs(UnmanagedType.IUnknown)]
                object QueryService(ref Guid guidService, ref Guid riid);
            }
        }
    </em>

    二、WebBrowser与JS的交互

    1、与页面标签的交互

    复制代码代码如下:
    //引用Microsoft.mshtml
     
     //1、添加一个html标签到id为lg的div中
     HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
     IHTMLElement lbelem = doc.createElement("button");
     lbelem.innerText = "test";
     lbelem.style.background = "red";
     IHTMLDOMNode node = doc.getElementById("lg") as IHTMLDOMNode;
     node.appendChild(lbelem as IHTMLDOMNode);   
     
     //2、设置id为su的标签value值和style
     //2.1 使用setAttribute
     HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
     IHTMLElement search = doc.getElementById("su");
     IHTMLDOMAttribute att = search.getAttribute("value") as IHTMLDOMAttribute;
     search.setAttribute("value", "百度一下");
     //search.click();
     search.style.display = "none"; 
     //2.2 使用outerHtml
     search.outerHTML = "<input id="su" value="百度一下" class="bg s_btn" type="submit" onclick="alert('百度一下');" />";
     //2.3 使用IHTMLDOMAttribute
     IHTMLAttributeCollection attributes = (search as IHTMLDOMNode).attributes as IHTMLAttributeCollection;
     foreach (IHTMLDOMAttribute attr in attributes)
     {
         if (attr.nodeName == "value")
         {
             attr.nodeValue = "百度一下";
         }
     }
     
    //3、替换应用了类样式mnav的a标签
     HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
     IHTMLElementCollection collect = doc.getElementsByTagName("a");
     foreach (IHTMLElement elem in collect)
     {
         if (!(elem is IHTMLUnknownElement) && elem.className != null)
         {
             if (elem.className.Equals("mnav", StringComparison.OrdinalIgnoreCase))
             {
                 elem.outerHTML = "<a href='#' title='替换标签' >替换</a>";
             }
         }
     }
     
     //4、删除节点
     HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
     IHTMLElement search = doc.getElementById("su");
     IHTMLDOMNode node = search as IHTMLDOMNode;
     node.parentNode.removeChild(node);
     
     //5、JS事件
     //5.1 添加JS
     HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
     IHTMLElement search = doc.getElementById("su");
     search.outerHTML = "<input id="su" value="百度一下" class="bg s_btn" type="submit" onclick="onClick();" />";
     IHTMLScriptElement scriptErrorSuppressed = (IHTMLScriptElement)doc.createElement("script");
     scriptErrorSuppressed.type = "text/javascript";
     scriptErrorSuppressed.text = "function onClick(){ alert('添加js'); }";
     IHTMLElementCollection nodes = doc.getElementsByTagName("head");
     foreach (IHTMLElement elem in nodes)
     {
         var head = (HTMLHeadElement)elem;
         head.appendChild((IHTMLDOMNode)scriptErrorSuppressed);
     }
     //5.2 删除JS
     IHTMLElementCollection scripts = (IHTMLElementCollection)doc.getElementsByName("script");
     foreach (IHTMLElement node in scripts)
     {
         if (!(node is IHTMLUnknownElement))
         {
             IHTMLScriptElement script = node as IHTMLScriptElement;
             //删除所有js文件引用
             if (string.IsNullOrEmpty(script.text))
             {
                 IHTMLDOMNode remove = script as IHTMLDOMNode;
                 remove.parentNode.removeChild(remove);
             }
         }
     }
     
     //6、write new html
     mshtml.IHTMLDocument2 doc2 = this.webBrowser.Document as mshtml.IHTMLDocument2;
     doc2.clear();
     doc2.writeln("<HTML><BODY>write new html</BODY></HTML>");

    2、数据交互

    复制代码代码如下:
    public MainWindow()
        {
            InitializeComponent();
            this.webBrowser.ObjectForScripting = new ScriptEvent();
            this.webBrowser.NavigateToString(@"<html><head><title>Test</title></head><body><input type=""button"" value=""点击"" onclick=""window.external.ShowMessage('百度一下');"" /></body></html>");
        }
     
    [System.Runtime.InteropServices.ComVisible(true)]
    public class ScriptEvent
    {
        //供JS调用
        public void ShowMessage(string message)
        {
            MessageBox.Show(message);
        }
    }

    希望本文所述对大家的C#程序设计有所帮助。

  • 相关阅读:
    ubuntu12.04.2上利用cmake安装opencv2.4.6
    微软无线鼠标3500滚轮问题
    Linux 安装 Tomcat
    Linux 安装 MySQL
    Linux 安装 JDK
    Linux 安装 Redis 及踩坑
    IDEA Git 撤销push(回退到指定版本)
    【Java】Ajax实现级联城市
    node.js更换镜像源
    【Java】数据库连接池的简单使用
  • 原文地址:https://www.cnblogs.com/mybabyyh/p/4523406.html
Copyright © 2020-2023  润新知