C#如何攔截 Webbrowser Control的響應內容
場景目標
假如Webbrowser中的一個頁面打開后第一件事就是執行了alert,我們想要阻止它該如何做?
<html>
<head>
<script src="foo.js"> </script>
<script>
alert('alert immediate!');
</script>
</head>
<body>
<h2> hello</h2>
</body>
</html>
綁定DocumentComplete事件,不行,太晚了js早已執行。
綁定ProgressChanged事件,不行,雖然早于load事件,但還是晚于js執行時間。
以上支持的事件根本無法達到目的,于是嘗試過FiddlerCore利用中間代理原理過濾網絡響應內容。
代理法雖然可以達到目的,但證書安裝、代理設置、網絡開銷都顯得不那么優雅穩定。
Navigated事件
一直以為Navigated事件是在發出請求后就觸發,最近突然發現并不是這樣。
經過測試,Navigated會在html里第一個script開始執行前觸發,這時加載的html會被截斷到第一個script標簽位置。
也就是說當此事件觸發時,瀏覽器內加載的html為
<html> <head> <script src="foo.js"> </script> </head> </html>
不過這時window、document等對象都已存在,于是我們就可以愉快地進行操作了。
注意:
1.主窗口及iframe都可觸發
2.觸發時頁面內js尚未執行
3.由于此事件早于任何js代碼的執行時間,所以無法實現對頁面內Js方法的覆蓋
4.如果第一個script在head里,也無法實現對HTML的修改 :)
5.如果動態插入script標簽或利用其它延時原理,有可能會在頁面的某個script標簽后執行,但執行先后次序極不可控,意義不大。
總結
此事件適用于需要在任何js執行前進行自定義操作的場景,操作內容限于對window、document對象的處理;如果第一個script標簽在body中,還可以對之前的html進行操作。
浙公網安備 33010602011771號