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#程序设计有所帮助。