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?

相關文章
相關標籤/搜索