我已经创建了一个替换页面函数的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. 在范围内运行该函数,没有注入页面 - 没有警报,但是在控制台中“未定义func”
  3. document.href = "javascript:..." - 没有
  4. document.body.addEventListener("load", ...) - 没有

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

不幸的是,这是我的第一个Chrome Usercript,即使经过一个小时左右的谷歌搜索和戳戳之后,我也很茫然。有帮助吗?

实际脚本,目前在GreasemonKey工作: http://pastebin.com/htlvjyhg

有帮助吗?

解决方案

最后,我发现在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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top