2010-10-19 3 views
22

Я хочу остановить выполнение одной строки с сайта, чтобы вся страница читалась браузером, за исключением одной строки. Или браузер может просто пропустить выполнение этой функции javascript.Остановить выполнение функции Javascript (на стороне клиента) или настроить его

ИЛИ

Есть ли способ я могу настроить JavaScript как-то так, что случайное число производящая функция в JavaScript не генерируют случайное число, но цифры я хочу ...

Я не имею доступа к сайт, на котором размещен сценарий, поэтому все это нужно сделать на стороне клиента.

+1

Можете ли вы показать нам код и указать строку, которую вы хотите отключить? – hookedonwinter

+2

Вы можете просто загрузить JS, изменить его локально и выполнить там? – Rudu

+0

Я разместил решение здесь: http: // stackoverflow.com/a/9699686/6355 Так как это немного больше, чем ссылка здесь, она снова повторяется: http://userscripts.org/scripts/show/125936 – Sarien

ответ

0

Вы можете использовать так называемый букмарклет.

построить JS файл, который вы хотите запустить на другом сайте: your.js

Сделать страницу HTML с помощью следующего кода:

<html> 
<body> 
    <a href="javascript:(function(){var s=document.createElement('SCRIPT');s.src='/url/to/your.js?'+(Math.random());document.getElementsByTagName('head')[0].appendChild(s);})()"> 
    Drag'n Drop this to your bookmarks 
    </a> 
</body> 
</html> 

Заменить /url/to/your.js с пути вашего файла JS.

Загрузите эту маленькую страницу в свой браузер и перетащите ее в панель закладок.

Перейдите на веб-сайт, который вы хотите взломать, и щелкните созданную вами закладку.
Это загрузит your.js на странице и запустит код.

Примечание: ?'+(Math.random()) части, чтобы избежать ваших JS кэшируются, это не является обязательным, но это полезно, когда вы разрабатываете your.js

7

Ответ зависит от деталей, которые не были предоставлены (точные страниц и строк из кода будет лучше), но вот как вы делаете это в целом:

  1. Если виновный JS код не срабатывает сразу (Пожары после DOMContentLoaded), то вы можете использовать G reasemonkey, чтобы заменить нарушающий код. EG:

    var scriptNode   = document.createElement ("script"); 
    scriptNode.textContent = "Your JS code here"; 
    document.head.appendChild (scriptNode); 
    

    Выполнено.

  2. Если код JS сразу же срабатывает, то он усложняется.
    Сначала возьмите копию сценария и внесите необходимые изменения. Сохраните это локально.

  3. Является ли оскорбительный сценарий в файле или находится на главной странице HTML (<script src="Some File> против <script>Mess O' Code</script>)?

  4. Если сценарий находится в файле, установите Adblock Plus и используйте его для блокировки загрузки этого скрипта. Затем используйте Greasemonkey, чтобы добавить измененный код на страницу. EG:

    var scriptNode   = document.createElement ("script"); 
    scriptNode.setAttribute ("src", "Point to your modified JS file here."); 
    document.head.appendChild (scriptNode); 
    
  5. Если скрипт находится в главной HTML страницы, а затем установить либо NoScript (лучший) или YesScript и использовать его, чтобы блокировать JavaScript с этого сайта.
    Это означает, что вам понадобится использовать Greasemonkey для замены всех скриптов с этого сайта, которые вы хотите запустить.

32

Firefox в настоящее время поддерживает the beforescriptexecute event (по состоянию на Version 4, released on March 22, 2011) .

С этим событием и the // @run-at document-start directive, Firefox и Greasemonkey теперь, похоже, делают хорошую работу, перехватывая специфические <script> теги.

Это еще не возможно для Chrome + Tampermonkey. Для чего угодно, кроме Firefox + Greasemonkey, вам нужно будет использовать методы, как показано в других ответах ниже, о написании полного расширения браузера.

The checkForBadJavascripts function инкапсулирует это. Например, предположим, что страница имела <script> тег как так:

<script> 
    alert ("Sorry, Sucka! You've got no money left."); 
</script> 

Вы можете использовать checkForBadJavascripts так:

checkForBadJavascripts ([ 
    [ false, 
     /Sorry, Sucka/, 
     function() { 
      addJS_Node ('alert ("Hooray, you\'re a millionaire.");'); 
     } 
    ] 
]); 

получить гораздо приятнее сообщение. (^_^)
См. Встроенную документацию, в checkForBadJavascripts, для получения дополнительной информации.


Чтобы увидеть демонстрацию полного сценария, первый визит this page at jsBin. Вы увидите 3 строки текста, два из которых добавлены JS.

install this script (View source; также находится внизу.) И перейдите на страницу. Вы увидите, что GM-скрипт удалил один плохой тег и заменил другой нашим «хорошим» JS.


Обратите внимание, что только Firefox поддерживает beforescriptexecute событие. И он был удален из спецификации HTML5 без указанной эквивалентной возможности.



Complete GM Пример сценария (То же, как тот, на GitHub и jsBin):

Учитывая этот HTML:

<body onload="init()"> 
<script type="text/javascript" src="http://jsbin.com/evilExternalJS/js"></script> 
<script type="text/javascript" language="javascript"> 
    function init() { 
     var newParagraph   = document.createElement ('p'); 
     newParagraph.textContent = "I was added by the old, evil init() function!"; 
     document.body.appendChild (newParagraph); 
    } 
</script> 
<p>I'm some initial text.</p> 
</body> 


Используйте этот Greasemonkey скрипт:

// ==UserScript== 
// @name  _Replace evil Javascript 
// @include  http://jsbin.com/ogudon* 
// @run-at  document-start 
// ==/UserScript== 

/****** New "init" function that we will use 
    instead of the old, bad "init" function. 
*/ 
function init() { 
    var newParagraph   = document.createElement ('p'); 
    newParagraph.textContent = "I was added by the new, good init() function!"; 
    document.body.appendChild (newParagraph); 
} 

/*--- Check for bad scripts to intercept and specify any actions to take. 
*/ 
checkForBadJavascripts ([ 
    [false, /old, evil init()/, function() {addJS_Node (init);} ], 
    [true, /evilExternalJS/i, null ] 
]); 

function checkForBadJavascripts (controlArray) { 
    /*--- Note that this is a self-initializing function. The controlArray 
     parameter is only active for the FIRST call. After that, it is an 
     event listener. 

     The control array row is defines like so: 
     [bSearchSrcAttr, identifyingRegex, callbackFunction] 
     Where: 
      bSearchSrcAttr  True to search the SRC attribute of a script tag 
           false to search the TEXT content of a script tag. 
      identifyingRegex A valid regular expression that should be unique 
           to that particular script tag. 
      callbackFunction An optional function to execute when the script is 
           found. Use null if not needed. 
    */ 
    if (! controlArray.length) return null; 

    checkForBadJavascripts  = function (zEvent) { 

     for (var J = controlArray.length - 1; J >= 0; --J) { 
      var bSearchSrcAttr  = controlArray[J][0]; 
      var identifyingRegex = controlArray[J][1]; 

      if (bSearchSrcAttr) { 
       if (identifyingRegex.test (zEvent.target.src)) { 
        stopBadJavascript (J); 
        return false; 
       } 
      } 
      else { 
       if (identifyingRegex.test (zEvent.target.textContent)) { 
        stopBadJavascript (J); 
        return false; 
       } 
      } 
     } 

     function stopBadJavascript (controlIndex) { 
      zEvent.stopPropagation(); 
      zEvent.preventDefault(); 

      var callbackFunction = controlArray[J][2]; 
      if (typeof callbackFunction == "function") 
       callbackFunction(); 

      //--- Remove the node just to clear clutter from Firebug inspection. 
      zEvent.target.parentNode.removeChild (zEvent.target); 

      //--- Script is intercepted, remove it from the list. 
      controlArray.splice (J, 1); 
      if (! controlArray.length) { 
       //--- All done, remove the listener. 
       window.removeEventListener (
        'beforescriptexecute', checkForBadJavascripts, true 
       ); 
      } 
     } 
    } 

    /*--- Use the "beforescriptexecute" event to monitor scipts as they are loaded. 
     See https://developer.mozilla.org/en/DOM/element.onbeforescriptexecute 
     Note that it does not work on acripts that are dynamically created. 
    */ 
    window.addEventListener ('beforescriptexecute', checkForBadJavascripts, true); 

    return checkForBadJavascripts; 
} 

function addJS_Node (text, s_URL, funcToRun) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    //--- Don't error check here. if DOM not available, should throw error. 
    targ.appendChild (scriptNode); 
} 
+1

before/afterscriptexecute были удалены из стандарта HTML5 в апреле 2016 года из-за того, что FF был единственным поставщика, к сожалению. – imoatama

1

Использование TamperMonkey? Все, что вам нужно добавить ниже вашего // @grant в заголовке TamperMonkey, - // @require http://urlofyoursite.com/myfile.js. Например, вот самая вершина моего объекта TamperMonkey:

// ==UserScript== 
// @name   Project 
// @namespace http://tampermonkey.net/ 
// @version  0.1 
// @description try to take over the world! 
// @author  You 
// @match  https://docs.google.com/presentation/* 
// @grant  none 
// @require http://cdnjs.cloudflare.com/ajax/libs/annyang/2.1.0/annyang.min.js 
// ==/UserScript== 
Смежные вопросы