GreaseMonkey裝在FF上有段時間了,一直處于禁用狀態
前幾天和香草山討論瀏覽器外掛程式,提到了這隻猴子,抽空測試了一下
對GM有了個大體的印象:
這個東東本質上就是塊JS
它通過瀏覽器這個層面,在解析完頁面之後,往頁面裡丟進去一塊js讓其運行
這塊js啟動並執行時候,可以對頁面中的DOM進行增刪改查的操作,由此實現使用者想要的一些效果。
可能是出於安全性的考慮,GM的js似乎有自己單獨的空間(sand-box?)
不能直接修改原頁面的JS變數和函數,除非使用unsafeWindow來改變原頁面的變數和函數
因為這個原因,我無法修複原網頁載入過程中出現的錯誤以及導致的一些未定義變數。
而且那些載入過程中的動作我也無法控制。
關於unsafeWindow,參考:
http://suddymail.org/show-165-1.html
http://lifegoo.pluskid.org/?p=113
這個難題目前我還沒找到解決的方法,不過Opera給了我一點希望。。。
opera的USERJS
operachina是這樣描述USERJS的執行原理的:
瀏覽器在載入頁面時,網頁、指令碼、樣式,及圖片等相繼被載入。但是,當頁面中的首個指令碼被執行前,使用者指令碼就已經被執行了。由於它是最早執行被執行的指令碼,所以它獲得的控制權就比較早,它可以:
* 決定所瀏覽頁面中,哪些外部 JavaScript 檔案可以被載入;
* 改寫所載入網頁中的任何指令碼(<script>)塊代碼;
* 攔截頁面上正在被檢測的事件,以此改變事件的處理方式;
* 替換網頁指令碼中定義的變數和函數;
除此之外,使用者指令碼做為所瀏覽網頁的一部分,當然也能完成網頁自身指令碼所能完成的功能。包括,檢測事件、建立變數、建立函數,並且讀取所應用到頁面的 Cookie 等。使用者指令碼能擁有如此高的控制權,完全依賴於它是從 Opera 核心進行支援的,並且通過這種特性所獲得的能力,同樣被擴充到了 Opera Mini 及 Opera Mobile 平台上。
根據它這裡的描述,使用者指令碼是在頁面載入前被執行的,所以能夠在載入前做些事情
但是進而一想,這也不對啊,使用者指令碼先執行,事兒倒是幹了,但是剛才初始化的變數、函數,待會兒不還是給頁面裡的同名變數、函數給覆蓋掉了。
Opera的設計者當然想到了這點,所以提供了很多相關的介面,比如下面這兩個:
window.opera.defineMagicVariable(targetVariableName, fun1,fun2)
window.opera.defineMagicFunction(targetFunctionName,fun1)
這兩個“魔術介面”的詳情我不轉貼過來了,我還沒研究清楚的東西就先不貼。
有興趣的可以點擊這裡前往觀看。
我想,我的難題也許可以通過這幾個介面,在Opera上得到解決?
抽空繼續研究中。。。