如何使用用户脚本覆盖函数?

Rea*_*onk 3 javascript userscripts

我想更改网页显示的部分内容,是否可以用usercript覆盖一个函数?

下面是我想覆盖的功能(也可以在这里找到):

function StartDrawing() {
    if ((typeof (systemsJSON) != "undefined") && (systemsJSON != null)) {
        var stellarSystemsLength = systemsJSON.length;
        $('#mapDiv').empty();
        if (stellarSystemsLength > 0) {
            InitializeRaphael();

            var i = 0;
            for (i = 0; i < stellarSystemsLength; i++){
                var stellarSystem = systemsJSON[i];
                DrawSystem(stellarSystem)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许我运行自己的绘图算法.

如何使用chrome(或Firefox)中的用户脚本执行此操作?

Bro*_*ams 6

请参阅" 从Greasemonkey 访问变量(和函数)到页面",反之亦然.

用户脚本与目标页面分离,因此您无法在不了解上下文的情况下覆盖函数或变量...

如果函数是全局的(看起来可能就是这种情况),您可以注入新的函数定义:

function StartDrawing () {
    // WHATEVER YOU WANT FOR THE NEW CODE GOES HERE.
}

addJS_Node (StartDrawing);

function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}
Run Code Online (Sandbox Code Playgroud)


这适用于几乎所有支持用户脚本的浏览器.

在某些情况下,您可能需要通过触发窗口load事件和/或检查函数是否已存在来延迟加载.

根据您的浏览器,您可能还有其他选项(请参阅上面的链接问答):

  • Firefox + Greasemonkey中,您可以使用@grant none模式或unsafeWindow.
  • Chrome + Tampermonkey中,您通常可以使用unsafeWindow. @grant none模式可能也有效,但我自己没有测试过.




如果函数不是全局的:

然后在Firefox中,你必须覆盖JS源代码.请参阅"停止执行javascript函数(客户端)或调整它".

在Chrome中,你大部分都不走运(最近几个月前验证过).