場景目標
假如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進行操作。