部分阻止Firefox中嵌入的JavaScript

部分阻止Firefox中嵌入的JavaScript,firefox,greasemonkey,Firefox,Greasemonkey,是否有Firefox扩展能够阻止页面中嵌入javascript的单个函数 <html> <head> <script type='text/javascript'> function onLoad(){ setTimeout(annoying, 1800000); } function annoying(){

是否有Firefox扩展能够阻止页面中嵌入javascript的单个函数

<html>
    <head>
        <script type='text/javascript'>
            function onLoad(){
                setTimeout(annoying, 1800000);
            }    

            function annoying(){
                //do something annoying
            }


            function useful(){
                //do something useful
            }
        </script>
    </HEAD>
    <BODY  onload="onLoad()">
        <!--rest of page goes here-->
    </BODY>
</HTML>

函数onLoad(){
设置超时(恼人,1800000);
}    
函数(){
//做些烦人的事
}
函数有用(){
//做些有用的事
}
也许这是一条路要走

下面的答案是非常详细的技术性问题,如果我做得太过分了,很抱歉;)

这在一定程度上取决于脚本如何使用函数<代码>恼人()。我还不是JavaScript方面的专家,一些更有经验的人的声音可能会有用

如果像
window.setInterval()
window.setTimeout()
这样的函数使用了
ending()
,您可能无法直接覆盖该函数,因为JavaScript具有作用域(闭包)的怪癖。当执行code
window.setTimeout(恼人,600)
时,将存储对“old”
恼人的引用,并执行该“old”版本。然后,您可以尝试删除调用
窗口的代码。改为在
上设置timeout

在其他情况下,您可以添加具有相同名称的函数,并使用以下Greasemonkey用户脚本实际覆盖该函数:

  function addScript(sourceCode)
  {
     var script = document.createElement('script');
     script.innerHTML = sourceCode;
     var head = document.getElementsByTagName("head")[0];
     head.insertBefore(script, head.firstChild); // insert the script as a first child of <HEAD>
  }
  addScript('function annoying(){alert("overwritten")}');
函数addScript(源代码)
{
var script=document.createElement('script');
script.innerHTML=源代码;
var head=document.getElementsByTagName(“head”)[0];
head.insertBefore(script,head.firstChild);//将脚本作为
}
addScript('function(){alert(“overwrited”)});
如果您有下面这样的代码(我无法提供实时演示,因为它在JSFIDLE上的工作方式不同,可能是因为它的沙箱),并且上面的用户脚本是为该域启动的,那么在页面加载600毫秒后,您将收到“讨厌的警报”警报,但在您单击文本的任何时候,您都将收到“覆盖”警报警惕


函数(){
警报(“恶劣警报”);
}
函数有用(){
//做些有用的事
}
window.setTimeout(恼人的,600);//关闭;按执行时的状态绑定到函数
点击我

我知道如何每页阻止它。。。我这里有一个脚本让我感到困扰:

<script type="text/JavaScript">
<!--
function timedRefresh(timeoutPeriod) {
    setTimeout("location.reload(true);",timeoutPeriod);
}
//   -->
</script>
</head> 
<body onload="JavaScript:timedRefresh(300000);">

微笑,单击“确定”,然后继续我的旅程。

我在这里发布了一个解决方案:


因为它只不过是一个链接,所以再次出现:

这没有帮助,反而加剧了问题

如果启用了javascript,以下内容尤其有害和丑陋:

<script>
    setInterval("alert('irritate')",10)
</script>
如果可以足够快地单击,则可能作为书签的URI。
但是,

只能通过

javascript:setInterval=function(){}
在脚本运行之前

祝你好运:

<script>
    (function(){(function r(){alert('irritate');r()})()})()
</script>

(函数(){(函数r(){alert('express');r()})(})()
甚至更简单

<script>
    ( function r(){alert('irritate');r()} ) ()
</script>

(函数r(){alert('express');r()})()
设置
alert=function()。另外,
r
不在全局环境中,因此
r=function(){}
无效


一些FF版本需要一个有趣的解决方案,如果
警报
响应是强制性的,则可以通过使用
ctrl-F4
关闭有问题页面的选项卡,在不关闭浏览器和其他打开的选项卡的情况下关闭恼人的页面。为了帮助快速完成此操作所需的手动反射和灵活性,
ctrl-Enter
用于响应提示,当按下
ctrl-Enter
时,键入
F4

可能没有专门的扩展名来执行此操作,但Greasemonkey是一个很好的扩展名。我加了“greasemonkey”标签。此外,我认为将其移动到StackOverflow可能会很有用,这样更有经验的JS人员可以添加他们的意见。@jakub.gieryluk如果解决方案变成GM编程问题,我将毫无问题地切换到StackOverflow;但是我不知道怎么做。添加了一点额外的代码来显示调用有多烦人。以及如何调用
onLoad
。:)<代码>
?Greasemonkey脚本是在
DOMContentLoaded
上执行的,因此在这种情况下覆盖它可能为时已晚。我投票将问题移至SO(问题下方的“标志”->“主题外”->“属于SO”)。@jakub.gieryluk是的,这就是它的名称。通过onLoad()函数中的setTimeout()调用;我能用greasemonkey覆盖它吗?如果执行了
setTimeout
,那么可能太晚了。必须防止执行
setTimeout
本身。您可以使用
窗口删除超时。clearTimeout
但它需要超时ID作为参数(超时ID由setTimeou返回,但在您提供的示例中,对超时ID的引用不存储在任何变量中)。这意味着,将它们的函数替换为不受firebug影响的函数。哦,它会在我启动firebug之前调用settimeout。您无法查找和/或终止超时列表,这将是一个很好的功能。noscript将正确关闭这是每次启动浏览器/首次访问网站时都必须手动执行的操作吗?在这一点上,修复它最终带来的机会成本与一开始只做我讨厌的脚本想要的一样高;它增加的不稳定性真的令人讨厌。
javascript:setTimeout=function(){}
setInterval("alert('irritate')",10)
javascript:setInterval=function(){}
<script>
    (function(){(function r(){alert('irritate');r()})()})()
</script>
<script>
    ( function r(){alert('irritate');r()} ) ()
</script>