Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我无法控制的情况下更改HTML页面上的Javascript_Javascript_Greasemonkey - Fatal编程技术网

在我无法控制的情况下更改HTML页面上的Javascript

在我无法控制的情况下更改HTML页面上的Javascript,javascript,greasemonkey,Javascript,Greasemonkey,我正在使用一个我无法控制的HTML页面。它在内联标记中定义Javascript函数,并在中调用它: <html> ... <body onload="init()"> <script type="text/javascript" language="javascript"> function init() { ... } </script> ... ... 函数init(){ ... } ... 在调用该函数之

我正在使用一个我无法控制的HTML页面。它在内联
标记中定义Javascript函数,并在
中调用它:

<html>
...
<body onload="init()">
<script type="text/javascript" language="javascript">
    function init() {
        ...
    }
</script>
...

...
函数init(){
...
}
...
在调用该函数之前,如何更改该函数?我曾尝试使用Greasemonkey修改脚本或在脚本之后插入另一个脚本以覆盖函数,但似乎没有任何效果。

Greasemonkey现在通常可以通过利用和
@在文档开始时运行来完成这类工作。请注意,似乎只有Firefox支持该事件,因此这在Chrome上不起作用。有关更繁琐的方法,请参见和

要在调用该函数之前更改该函数,请利用下面定义的
checkForBadJavascripts()
函数

你可以这样称呼它:

/---新的“init”函数替换坏的函数。
函数init(){
//…在这里做你想做的事。。。
}
checkForBadJavascripts([
[false,/function\s+init(/,function(){addJS_Node(init);}]
] );
其中
function\s+init(
必须是目标标记
的唯一项。(注意
addJS\u Node()
也在下面定义。)


例如,visit.您将看到3行文本,其中两行是由JS添加的

现在,安装下面的脚本并重新访问页面。您将看到GM脚本删除了一个坏的
标记,并用我们的“好”JS替换了另一个

/==UserScript==
//@name\u
//@包括http://output.jsbin.com/tezoni*
//@在文档开始时运行
//@grant none
//==/UserScript==
/******我们将使用的新“init”函数
而不是旧的、糟糕的“init”函数。
*/
函数init(){
var new段落=document.createElement('p');
newparagration.textContent=“我是由新的、好的init()函数添加的!”;
document.body.appendChild(新段落);
}
/*---检查错误脚本以拦截并指定要采取的任何操作。
*/
checkForBadJavascripts([
[false,/old,evil init()/,function(){addJS_Node(init);}],
[true,/evillexternaljs/i,null]
] );
函数检查禁止Javascripts(controlArray){
/*---请注意,这是一个自初始化函数
参数仅在第一次调用时处于活动状态。之后,它是一个
事件侦听器。
控件数组行的定义如下:
[BSearchRCattr,identificationregex,callbackFunction]
哪里:
bsearchrcattr True搜索脚本标记的SRC属性
false搜索脚本标记的文本内容。
IdentificationRegex应为唯一的有效正则表达式
到特定的脚本标记。
callbackFunction是脚本运行时要执行的可选函数
已找到。如果不需要,请使用null。
*/
如果(!controlArray.length)返回null;
checkForBadJavascripts=函数(zEvent){
对于(var J=controlArray.length-1;J>=0;--J){
var bsearchrcattr=controlArray[J][0];
var identificationregex=controlArray[J][1];
如果(b搜索rcattr){
if(identificationregex.test(zEvent.target.src)){
stopbad(J);
返回false;
}
}
否则{
if(identificationregex.test(zEvent.target.textContent)){
stopbad(J);
返回false;
}
}
}
函数stopBadJavascript(controlIndex){
zEvent.stopPropagation();
zEvent.preventDefault();
var callbackFunction=controlArray[J][2];
if(调用函数的类型==“函数”)
callbackFunction();
//---删除节点只是为了清除Firebug检查中的混乱。
zEvent.target.parentNode.removeChild(zEvent.target);
//---脚本被截获,请将其从列表中删除。
控制阵列拼接(J,1);
if(!controlArray.length){
//---全部完成后,删除侦听器。
window.removeEventListener(
“beforescriptexecute”,checkForBadJavascripts,true
);
}
}
}
/*---使用“beforescriptexecute”事件在加载SCIPT时监视SCIPT。
看见https://developer.mozilla.org/en/DOM/element.onbeforescriptexecute
请注意,它不适用于动态创建的acript。
*/
window.addEventListener('beforescriptexecute',checkForBadJavascripts,true);
返回checkForBadJavascripts;
}
函数addJS_节点(文本、s_URL、函数名){
var D=文件;
var scriptNode=D.createElement('script');
scriptNode.type=“text/javascript”;
如果(text)scriptNode.textContent=text;
如果(s_URL)scriptNode.src=s_URL;
if(funcToRun)scriptNode.textContent='('+funcToRun.toString()+')()';
var targ=D.getElementsByTagName('head')[0]| | D.body | | D.documentElement;
//---不要在这里检查错误。如果DOM不可用,应该抛出错误。
target.appendChild(脚本节点);
}

以下Greasemonkey用户脚本(基于)终于对我起作用了。它通过在现有的
脚本
标记之后的新
脚本
标记中定义另一个同名的函数来覆盖现有函数。不需要在
处运行
,也不需要在
之前执行

var firstScript = document.body.getElementsByTagName('script')[0];
var newScript = document.createElement('script');
var scriptArray = new Array();
scriptArray.push('function init() {');
scriptArray.push('    ...');
scriptArray.push('}');
newScript.innerHTML = scriptArray.join('\n');
scriptArray.length = 0; // free this memory
firstScript.parentNode.insertBefore(newScript, firstScript.nextSibling);
我以前没有太多使用Greasemonkey甚至Javascript的经验,所以我找到了我喜欢的Firefox Web开发工具