2010-08-22 87 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