通过Chrome中的用户脚本替换页面功能?

时间:2010-08-22 17:57:37

标签: google-chrome greasemonkey userscripts

我创建了一个替换页面函数的Greasemonkey脚本:

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

我一直希望这个脚本能够在Gresemonkey和Chrome中运行,并且已经读过Chrome不支持unsafeWindow,所以通过将函数转换为字符串并使用{将脚本注入到页面中{1}}:

setTimeout

这在Greasemonkey中非常有效,但在Chrome中绝对没有任何帮助。它显然没有触发,但日志中也没有出现任何内容。我尝试了许多其他注射方式,但无法获得任何工作。 (为了测试,我还在函数的顶部添加了setTimeout("(function(){var old=func;func=function(){old();/*other stuff*/}}())", 0); 。)

  1. alert() - 没什么
  2. 在范围内运行函数,无需注入页面 - 没有警报,但在控制台中未定义“func”
  3. setTimeout(..., 0) - 没什么
  4. document.href = "javascript:..." - 没什么
  5. 所有这些都是document.body.addEventListener("load", ...)

    不幸的是,这是我的第一个Chrome用户,即使经过一个小时左右的谷歌搜索和围攻SO,我仍然不知道如何调试它。有什么帮助吗?

    实际脚本,目前在Greasemonkey中工作:http://pastebin.com/HtLVjYHg

1 个答案:

答案 0 :(得分: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