2010-08-22 32 views
2

我創建了一個Greasemonkey的腳本替換頁面功能:在Chrome中通過腳本替換頁面功能?

(function() { 
    var oldFunc = func; 
    func = function() { 
     oldFunc(); 
     // other stuff 
    }; 
)(); 

我一直打算這個腳本在這兩個Gresemonkey和Chrome的工作和閱讀過Chrome不支持unsafeWindow,所以已經注入腳本到頁面的功能轉換爲字符串,並使用setTimeout

setTimeout("(function(){var old=func;func=function(){old();/*other stuff*/}}())", 0); 

這工作得很好的Greasemonkey的,但讓我在Chrome絕對沒有。它顯然不是射擊,但日誌中也沒有出現。我已經嘗試了許多其他注射方式,但無法獲得任何工作。 (爲了測試,我還增加了alert()到函數的頂部。)

  1. setTimeout(..., 0) - 沒有
  2. 運行在範圍內的功能,無需注射入頁 - 沒有警報,但「FUNC不什麼
  3. document.body.addEventListener("load", ...) - - 沒有什麼

所有這些都是與@run-at document-end控制檯

  • document.href = "javascript:..."定義」。

    不幸的是,這是我的第一個Chrome用戶腳本,即使經過一個小時左右的谷歌搜索和撥動搜索引擎,我也不知道如何調試它。任何幫助?

    實際腳本,目前在Greasemonkey的工作:http://pastebin.com/HtLVjYHg

  • 回答

    4

    最後,我發現的唯一的技術,它在Chrome的工作是建立使用DOM方法<script>節點。幸運的是,這似乎在Firefox和Opera的工作同樣出色,並通過<func>.toString()是相當容易做:

    function embed() { 
        var oldFunc = window.func; 
    
        window.func = function() { 
         oldFunc(); 
    
         // other stuff 
        }; 
    } 
    
    var inject = document.createElement("script"); 
    
    inject.setAttribute("type", "text/javascript"); 
    inject.appendChild(document.createTextNode("(" + embed + ")()")); 
    
    document.body.appendChild(inject); 
    

    最終腳本:http://userscripts.org/scripts/review/84394