2

我创建了一个替换页面功能的 Greasemonkey 脚本:

(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. 在范围内运行函数,而不注入页面——没有警报,但在控制台中“未定义函数”
  3. document.href = "javascript:..."- 没有
  4. document.body.addEventListener("load", ...)- 没有

所有这些都与@run-at document-end.

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

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

4

1 回答 1

4

最后,我发现在 Chrome 中唯一有效的技术是<script>使用 DOM 方法创建节点。幸运的是,这似乎在 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

于 2010-08-30T17:11:47.760 回答