Частично заблокировать встроенный JavaScript в Firefox - PullRequest
2 голосов
/ 02 ноября 2011

Есть ли расширение 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 ]

2 голосов
/ 07 ноября 2011

Возможно Greasemonkey - это путь.

Ответ ниже довольно подробный технический, извините, если я зашел слишком далеко;)

Это немного зависит от того, как функция annoying() используется скриптами.Я еще не разбираюсь в JavaScript, может пригодиться голос более опытного человека.

Если annoying() используется такими функциями, как window.setInterval(), window.setTimeout(), вы, вероятно, не сможете переписать функцию напрямую, из-за JavaScript причуды с ограничением (замыкания).Когда код window.setTimeout(annoying, 600) выполняется, ссылка на «старую» annoying сохраняется и эта «старая» версия выполняется.Затем вы можете попытаться избавиться от кода, который вместо этого вызывает 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 миллисекунд после загрузки страницы у вас будет предупреждение "Nasty alert", но каждый раз, когда вы нажимаете текст, вы будете иметь "перезаписанное" предупреждение.

<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 голос
/ 14 марта 2012

Я разместил решение здесь: https://stackoverflow.com/a/9699686/6355

Поскольку это немного больше, чем ссылка, здесь снова идет: http://userscripts.org/scripts/show/125936

1 голос
/ 27 января 2012

Я знаю, как заблокировать его на странице ... У меня есть скрипт, который меня беспокоит:

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

То, что эти идиоты отказываются принимать во внимание, это то, что, если я ищу решения, я мог бы открыть более 10 из этих страниц, и 90% моего процессорного времени будет посвящено обновлению их страниц в фоновом режиме! ГРР

У меня есть firebug, удобный для веб-разработки, и я просто ввожу эту команду JS в консоль

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

улыбнись, щелкни ок и продолжай мой путь.

0 голосов
/ 08 февраля 2013

Это не помогает, но усугубляет проблему.

Особенно пагубно и уродливо, если включен javascript:

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

или

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

хотя это можно остановить (и все будущие тайм-ауты) с помощью:

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 требуется интересное решение, найденное в SO, если ответ alert является обязательным, для уничтожения надоедливой страницыне убивая браузер и другие открытые вкладки, используя ctrl-F4, чтобы закрыть вкладку страницы-нарушителя.Чтобы помочь ручному рефлексу и ловкости, необходимым для того, чтобы сделать это достаточно быстро, ctrl-Enter используется для ответа на приглашение, а при нажатии ctrl-Enter набирается F4.

...