在Firefox中部分阻止嵌入式JavaScript

时间:2011-11-02 19:15:31

标签: firefox greasemonkey

是否有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>

4 个答案:

答案 0 :(得分:2)

也许Greasemonkey是要走的路。

下面的答案是非常详细的技术,如果我走得太远,抱歉;)

这取决于脚本如何使用函数annoying()。我还不是JavaScript的专家,一些经验丰富的人的声音可能很有用。

annoying()window.setInterval()等函数使用window.setTimeout(),您可能无法直接覆盖该函数,因为JavaScript带有范围(闭包)的怪癖。执行代码window.setTimeout(annoying, 600)时,对&#34; old&#34;的引用annoying已存储,并且已经存储了#34}版本已执行。然后,您可能会尝试删除window.setTimeout上正在调用 annoying代码。

在其他情况下,您可以添加一个具有相同名称的函数,并事实上使用以下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")}');

如果您有类似下面的代码(我无法提供实时演示,因为它在JSFiddle上的工作方式不同可能是因为它的沙盒),并且上面的用户脚本是针对该域启动的,那么在页面加载后600毫秒后,您将有&#34;令人讨厌的警报&#34;提醒,但是当你点击文字时,你将被覆盖&#34;覆盖&#34;警报。

<html>
   <head>
      <script type='text/javascript'>
         function annoying(){
             alert("Nasty alert");
         }

         function useful(){
             //do something useful
         }

         window.setTimeout(annoying, 600); // closure; binds to the function as it is at the moment of execution
      </script>
   </head>
<body>
   <a onclick="annoying()">Click me</a>
</body>
</html>

答案 1 :(得分:1)

我知道如何每页阻止它...我在这里有一个麻烦的脚本:

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

这些白痴拒绝考虑的是,如果我正在寻找解决方案,我最终可以打开这些页面中的10个以上,然后90%的CPU时间用于在后台刷新页面! GRR

我有用于Web开发的firebug,我只需将这个JS命令输入控制台

timedRefresh = function(value){alert(value);}

微笑,点击确定,然后继续前进。

答案 2 :(得分:1)

我在这里发布了一个解决方案:https://stackoverflow.com/a/9699686/6355

由于它仅仅是一个链接,它再次出现:http://userscripts.org/scripts/show/125936

答案 3 :(得分:0)

这无济于事,反而加剧了这个问题。

如果启用了javascript,以下内容特别有害且难看:

<script>
    setInterval("alert('irritate')",10)
</script>

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

虽然可以通过以下方式停止(以及所有未来的TimeOuts):

javascript:setTimeout=function(){}

可能作为书签的URI,只要它可以足够快地点击 然而,

setInterval("alert('irritate')",10)

只能通过

停止
javascript:setInterval=function(){}

在脚本运行之前。

祝你好运:

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

甚至更简单

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

设置alert=function(){}将停止所有消息,但脚本及其r的递归在SO或系统超时之前不会停止。此外,r不在全球环境中,因此r=function(){}无效。

有些FF版本需要一个有趣的解决方案,如果alert响应是必需的,可以在SO上找到,通过使用ctrl-F4来杀死令人烦恼的页面,而无需杀死浏览器和其他打开的标签页关闭违规页面的标签。为了帮助快速完成此操作所需的手动反射和灵活性,ctrl-Enter用于响应提示,同时按下ctrl-Enter F4