C#的WEBBROWSER与JS交互小结
本文实例总结了C#的WEBBROWSER与JS交互的方法。分享给大家供大家参考。具体实现方法如下:
一、实现WebBrowser内部跳转,阻止默认打开IE
1、引用封装好的WebBrowserLinkSelf.dll实现
publicpartialclassMainWindow:Window { privateWebBrowserwebBrowser=newWebBrowser(); publicMainWindow() { InitializeComponent(); this.webBrowser.LoadCompleted+=newLoadCompletedEventHandler(webBrowser_LoadCompleted); //使webbrowser寄宿于Label上,实现webborwser内部跳转,不用IE打开 Labellb=newLabel{Content=webBrowser}; WebBrowserHelperwebBrowserHelper=newWebBrowserHelper(webBrowser); HelperRegistery.SetHelperInstance(lb,webBrowserHelper); webBrowserHelper.NewWindow+=WebBrowserOnNewWindow; this.lbBrowserHost.Content=lb; //this.webBrowser.Navigate(newUri("http://www.baidu.com",UriKind.RelativeOrAbsolute)); } privatevoidWebBrowserOnNewWindow(objectsender,CancelEventArgse) { dynamicbrowser=sender; dynamicactiveElement=browser.Document.activeElement; varlink=activeElement.ToString(); this.webBrowser.Navigate(newUri(link,UriKind.RelativeOrAbsolute)); e.Cancel=true; } }
2、引用com:MicrosoftInternetControls实现(参考MSDN:http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.aspxpublicpartialclassMainWindow:Window
<emid="__mceDel"> { publicMainWindow() { InitializeComponent(); this.webBrowser1.Navigate(newUri("http://www.baidu.com",UriKind.RelativeOrAbsolute)); this.webBrowser1.LoadCompleted+=newLoadCompletedEventHandler(webBrowser1_LoadCompleted); } privateIServiceProviderserviceProvider; voidwebBrowser1_LoadCompleted(objectsender,NavigationEventArgse) { if(this.serviceProvider==null) { serviceProvider=(IServiceProvider)webBrowser1.Document; if(serviceProvider!=null) { GuidserviceGuid=newGuid("0002DF05-0000-0000-C000-000000000046"); Guidiid=typeof(SHDocVw.WebBrowser).GUID; varwebBrowserPtr=(SHDocVw.WebBrowser)serviceProvider .QueryService(refserviceGuid,refiid); if(webBrowserPtr!=null) { webBrowserPtr.NewWindow2+=webBrowser1_NewWindow2; } } } } privatevoidwebBrowser1_NewWindow2(refobjectppDisp,refboolCancel) { dynamicbrowser=this.webBrowser1; dynamicactiveElement=browser.Document.activeElement; varlink=activeElement.ToString(); this.webBrowser1.Navigate(newUri(link,UriKind.RelativeOrAbsolute)); Cancel=true; } [ComImport,InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")] internalinterfaceIServiceProvider { [return:MarshalAs(UnmanagedType.IUnknown)] objectQueryService(refGuidguidService,refGuidriid); } } </em>
二、WebBrowser与JS的交互
1、与页面标签的交互
//引用Microsoft.mshtml //1、添加一个html标签到id为lg的div中 HTMLDocumentdoc=(HTMLDocument)this.webBrowser.Document; IHTMLElementlbelem=doc.createElement("button"); lbelem.innerText="test"; lbelem.style.background="red"; IHTMLDOMNodenode=doc.getElementById("lg")asIHTMLDOMNode; node.appendChild(lbelemasIHTMLDOMNode); //2、设置id为su的标签value值和style //2.1使用setAttribute HTMLDocumentdoc=(HTMLDocument)this.webBrowser.Document; IHTMLElementsearch=doc.getElementById("su"); IHTMLDOMAttributeatt=search.getAttribute("value")asIHTMLDOMAttribute; search.setAttribute("value","百度一下"); //search.click(); search.style.display="none"; //2.2使用outerHtml search.outerHTML="<inputid=\"su\"value=\"百度一下\"class=\"bgs_btn\"type=\"submit\"onclick=\"alert('百度一下');\"/>"; //2.3使用IHTMLDOMAttribute IHTMLAttributeCollectionattributes=(searchasIHTMLDOMNode).attributesasIHTMLAttributeCollection; foreach(IHTMLDOMAttributeattrinattributes) { if(attr.nodeName=="value") { attr.nodeValue="百度一下"; } } //3、替换应用了类样式mnav的a标签 HTMLDocumentdoc=(HTMLDocument)this.webBrowser.Document; IHTMLElementCollectioncollect=doc.getElementsByTagName("a"); foreach(IHTMLElementelemincollect) { if(!(elemisIHTMLUnknownElement)&&elem.className!=null) { if(elem.className.Equals("mnav",StringComparison.OrdinalIgnoreCase)) { elem.outerHTML="<ahref='#'title='替换标签'>替换</a>"; } } } //4、删除节点 HTMLDocumentdoc=(HTMLDocument)this.webBrowser.Document; IHTMLElementsearch=doc.getElementById("su"); IHTMLDOMNodenode=searchasIHTMLDOMNode; node.parentNode.removeChild(node); //5、JS事件 //5.1添加JS HTMLDocumentdoc=(HTMLDocument)this.webBrowser.Document; IHTMLElementsearch=doc.getElementById("su"); search.outerHTML="<inputid=\"su\"value=\"百度一下\"class=\"bgs_btn\"type=\"submit\"onclick=\"onClick();\"/>"; IHTMLScriptElementscriptErrorSuppressed=(IHTMLScriptElement)doc.createElement("script"); scriptErrorSuppressed.type="text/javascript"; scriptErrorSuppressed.text="functiononClick(){alert('添加js');}"; IHTMLElementCollectionnodes=doc.getElementsByTagName("head"); foreach(IHTMLElementeleminnodes) { varhead=(HTMLHeadElement)elem; head.appendChild((IHTMLDOMNode)scriptErrorSuppressed); } //5.2删除JS IHTMLElementCollectionscripts=(IHTMLElementCollection)doc.getElementsByName("script"); foreach(IHTMLElementnodeinscripts) { if(!(nodeisIHTMLUnknownElement)) { IHTMLScriptElementscript=nodeasIHTMLScriptElement; //删除所有js文件引用 if(string.IsNullOrEmpty(script.text)) { IHTMLDOMNoderemove=scriptasIHTMLDOMNode; remove.parentNode.removeChild(remove); } } } //6、writenewhtml mshtml.IHTMLDocument2doc2=this.webBrowser.Documentasmshtml.IHTMLDocument2; doc2.clear(); doc2.writeln("<HTML><BODY>writenewhtml</BODY></HTML>");
2、数据交互
publicMainWindow() { InitializeComponent(); this.webBrowser.ObjectForScripting=newScriptEvent(); this.webBrowser.NavigateToString(@"<html><head><title>Test</title></head><body><inputtype=""button""value=""点击""onclick=""window.external.ShowMessage('百度一下');""/></body></html>"); } [System.Runtime.InteropServices.ComVisible(true)] publicclassScriptEvent { //供JS调用 publicvoidShowMessage(stringmessage) { MessageBox.Show(message); } }
希望本文所述对大家的C#程序设计有所帮助。