C#的WEBBROWSER与JS交互小结

本文实例总结了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#程序设计有所帮助。