2012-09-25 71 views
27

我正在使用WebBrowser控件,並希望在控件中顯示HTML代碼之前操作它。在WebBrowser中顯示給用戶之前更改HTML?

對於下面的內容例如開放式網站A:

<html> 
    <body> 
    <p id="Text">Hello</p> 
    </body> 
</html> 

我想將其更改爲

<html> 
    <body> 
    <p id="Text">Bye</p> 
    </body> 
</html> 

我知道我可以做到這一點與DocumentCompleted事件,然後操縱它。但是,如果網站執行的文件就緒事件執行JavaScript的東西,改變它是沒有意義的,因爲它已經被執行。

+0

你希望它顯示之前更改下載HTML,然後只顯示改變的代碼,對不對? –

+0

是啊,你說得對,這正是我想要做的.. – RaphaelH

回答

14

你可以做的DOM操作的Navigated事件中:

webBrowser1.Navigated += (sender, e) => 
{ 
    ((WebBrowser)sender).Document.GetElementById("Text").InnerHtml = "Bye"; 
}; 

這將文檔中的任何DOM準備好處理程序之前執行。因此,例如,如果最初有以下HTML:

<html> 
<head> 
    <title>Test</title> 
</head> 
<body onload="document.getElementById('Text').innerHTML = document.getElementById('Text').innerHTML + ' modified';"> 
    <p id="Text">Hello</p> 
</body> 
</html> 

當您顯示在web瀏覽器的代碼,你會得到Bye modified

+2

我喜歡這個想法是什麼。但問題是,如果HTML文檔是有點大,在WebBrowser控件不會一下子讀到的一切,所以瀏覽的事件被調用,但它仍然加載頁面.. – RaphaelH

0

這不起作用。我面臨同樣的問題。如果你想修改ajax調用呢?導航方法從不觸發。導航方法也不會在iFrame上觸發。

我認爲唯一的解決辦法是使用代理。只需點擊添加NuGet包。搜索fiddlercore。一旦您添加對http://www.telerik.com/fiddler/fiddlercore的引用。現在只需執行谷歌搜索,瞭解如何使用FiddlerCore修改響應。我相信會有很多例子。

注:開始提琴手核心默認時,它會改變你的計算機上的代理服務器設置。你不希望出現這種情況!你只想讓你的瀏覽器控件連接到它而不是整個系統。因此,初始化fidderl核心在隨機端口進行偵聽,而不必作爲系統代理啓動。然後設置您的web瀏覽器控件以連接到該代理。

試圖訪問HTTPS時,它會變得棘手網站:/

0

你可以在setInterval回調與合理區間在適當的時間,例如在DOM準備這樣做(〜20毫秒),然後清除間隔。

唯一需要注意的是你的回調需要是冪等的,因爲它會被多次調用。如果您只是將數據屬性或類名稱添加到已修改的DOM節點,以免再次修改,我不認爲這應該很困難。

相關問題