VS C# .NET WebBrowser控件 利用插入JS代码,实现控制弹出IE窗口

最近在作一个客户端程序,使用到自带的WebBrowser控件时,发现当JS调用window.open()或a标签的target="_blank"时使用的是弹出IE窗口,不知道为何是这种设计,根本不知足需求嘛。上网查了一下相关资料,发现这个控件并无属性能控制这个功能,因而找第三方控件,发现也仍是不行(多是我不够仔细尝试),并且要多出个几十兆的DLL。通过我几个小时的努力,放弃了。。。!javascript

知道C#是能够与网页的JS交互的,因而想到网页上重写window.open()的方法,建一个HTML页面试一下,证明JS重写window.open()的可能,JS代码:html

window.open=function(url){window.location.href=url;}


试运行,成功被重写了。java

因为网页我是不能更改的,因而参考到C# WebBrowser执行JS代码的方法:web

IHTMLDocument2 doc2 = (IHTMLDocument2)webBrowser1.Document.DomDocument;
doc2.parentWindow.execScript("window.open=function(url){window.location.href=url;}");


‍‍‍‍‍一切OK,但有一个问题,就是这个方法使用到IHTMLDocument2,须要引用Microsoft.mshtml.dll,这个dll是自带的,位置通常在 C:\Program Files\Microsoft.NET\Primary Interop Assemblies,有近8M,我固然不能忍啊,因而继续在这条路上越走越深。面试

是后使用了不须要引用外部dll的方法,直接用HtmlDocument就能够的:c#

HtmlDocument doc = webBrowser1.Document;
HtmlElement script = doc.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "window.open=function(url){window.location.href=url;}");
doc.Body.AppendChild(script);


固然你也将JS能够写成方法,而后用 doc.InvokeScript()调用,这里我就无论了。性能

这时又有一个问题,这个代码时在当前的Document有效,也就是说HTML里面的iframe包含的HTML并不会生效,解决:url

//上面的doc改为:
doc = webBrowser1.Document.Window.Frames["iframe的name"].Document;


若是多个iframe的话遍历一下就行了。spa

最后再把a标签的target改一下就行了,终于完成了,这里记录分享一下~设计

转载请尊重原创,OK?

相关文章
相关标签/搜索