有一页例如。 http://somesite.com
运行位于路径中的一些javascript代码,例如http://somesite.com/code.js
在该文件中 - 其他代码 - 有一个函数(badFunction(x,y)
)。
我想更改其中一个局部变量的值,以使其与另一个(本地)变量(在另一个函数内部使用)相同,也位于那个远程javascript文件)。
因此,基于这两个答案1和2(即this userscript),
我尝试了以下简单的用户脚本,以便用我自己的实现替换整个badFunction
,但它不起作用(即我的badFunction
未注入加载的code.js
- 我已经通过Firefox的调试器检查了它。
我试图用usercript完成的是,在加载code.js
时,在达到badFunction
定义时,注入我的函数实现,然后,让休息code.js
继续正常加载。
我的用户名出了什么问题?或者我的方法完全错了?
我不希望提供前面提到的远程javascript文件的实际网址,因为它是NSFW。
// ==UserScript==
// @name @document-start Example
// @version 1
// @namespace
// @include http://somesite.com/*
// @run-at document-start
// ==/UserScript==
var changed = 1; // script need to be edited with
window.addEventListener('beforescriptexecute', function(e) {
///for external script:
src = e.target.src;
if (src.search(/code\.js/) == "badFunction") {
changed--;
e.preventDefault();
e.stopPropagation();
append(badFunction);
};
///when done, remove the listener:
if(changed == 0) window.removeEventListener(e.type, arguments.callee, true);
}, true);
////// append with new block function:
function append(s) {
document.head.appendChild(document.createElement('script'))
.innerHTML = s.toString().replace(/^function.*{|}$/g, '');
}
function badFunction(x, y)
{
// my code
};
答案 0 :(得分:1)
我没有您网站的源代码,因此我不知道如何声明和调用badFunction
。但请记住,如果在闭包内调用该函数,则需要在该闭包内的某处注入代码:
(function someClosure() {
function hello() {
// code
}
// hello is available
})();
// hello is not available
在link中,他们展示了如何修改现有的源代码
window.addEventListener('beforescriptexecute', function(e) {
///for external script:
src = e.target.src;
if (src.search(/bad\.js/) != -1) {
changed++;
e.preventDefault();
e.stopPropagation();
append(NewScript1);
};
});
所以基本上你需要搜索你的功能代码并替换它。请注意,您可以使用[\s\S]*
link
答案 1 :(得分:1)
读完这两个答案后(当然我赞成):
How to overwrite a function using a userscript?和
Stop execution of Javascript function (client side) or tweak it
(并且因为badfunction
不是全局的,code.js
会立即触发并且是文件,而不是内联的)
我得出的解决方案是:
然后使用第二个链接中提供的脚本 将我修改过的本地文件添加到页面中。
var scriptNode = document.createElement ("script");
scriptNode.setAttribute ("src", "Point to your modified JS file here.");
document.head.appendChild (scriptNode);