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)中的用户脚本执行此操作?
请参阅" 从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事件和/或检查函数是否已存在来延迟加载.
根据您的浏览器,您可能还有其他选项(请参阅上面的链接问答):
@grant none模式或unsafeWindow.unsafeWindow. @grant none模式可能也有效,但我自己没有测试过.然后在Firefox中,你必须覆盖JS源代码.请参阅"停止执行javascript函数(客户端)或调整它".
在Chrome中,你大部分都不走运(最近几个月前验证过).