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

Javascript 如何使用用户脚本覆盖函数?,javascript,userscripts,Javascript,Userscripts,我想更改网页显示的部分内容,是否可以用用户脚本覆盖函数 下面是我想要覆盖的函数(也包括): 函数开始绘制(){ if((typeof(systemsJSON)!=“undefined”)&(systemsJSON!=null)){ var StellarsSystemLength=systemsJSON.length; $('#mapDiv').empty(); 如果(恒星系统长度>0){ InitializeRaphael(); var i=0; 对于(i=0;i

我想更改网页显示的部分内容,是否可以用用户脚本覆盖函数

下面是我想要覆盖的函数(也包括):

函数开始绘制(){
if((typeof(systemsJSON)!=“undefined”)&(systemsJSON!=null)){
var StellarsSystemLength=systemsJSON.length;
$('#mapDiv').empty();
如果(恒星系统长度>0){
InitializeRaphael();
var i=0;
对于(i=0;i
这将允许我运行自己的绘图算法


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

javascript允许在函数存在时重新定义函数。如果重新定义,函数将在没有任何警告的情况下被覆盖

如果您想让旧函数也工作,可以采用以下方法

var _oldStartDrawing =StartDrawing;
function StartDrawing() {
     _oldStartDrawing();//if you need previous function
     //extend code here;
}

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

如果函数是全局函数(在本例中看起来可能是全局函数),则可以使用新函数定义:

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);
}

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

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

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

  • Firefox+Greasemonkey中,您可以使用
    @grant none
    模式或
    取消安全窗口
  • Chrome+Tampermonkey中,通常可以使用
    取消安全窗口
    @grant none
    模式可能也能工作,但我自己还没有测试过



如果函数不是全局函数: 然后在Firefox中,您必须在JS源代码进入时覆盖它。看


在Chrome中,你的运气很差(上次验证是在六个月前)。

你的打字错误将导致重大问题。@epascarello你是对的,我总是忘记那个机制。这看起来很简单,不像公认的答案。是否有任何警告?@M.Volf如果原始页面脚本中使用的函数及其随后的事件调用,原始页面脚本write将调用新的覆盖脚本。理论上,如果通过事件调用函数,可能会影响其他用户脚本。
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);
}