【问题标题】:Replacing page functions via userscript in Chrome?通过 Chrome 中的用户脚本替换页面功能?
【发布时间】:2010-08-22 17:57:36
【问题描述】:

我创建了一个替换页面功能的 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

【问题讨论】:

    标签: google-chrome greasemonkey userscripts


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多