2010-10-19 17 views
22

Chcę zatrzymać wykonywanie pojedynczej linii z witryny, tak aby cała strona była odczytywana przez przeglądarkę z wyjątkiem tej pojedynczej linii. Lub przeglądarka może po prostu pominąć wykonanie tej funkcji javascript.Zatrzymaj wykonywanie funkcji JavaScript (po stronie klienta) lub dostosuj ją

LUB

Czy istnieje sposób mogę dostosować JavaScript jakoś tak, że liczba losowa funkcję generowania w javascript nie generuje liczbę losową, ale numery chcę ...

I dont mieć dostęp do strona, na której znajduje się skrypt, więc wszystko to musi być zrobione po stronie klienta.

+1

Czy możesz pokazać nam kod i punkt w linii, którą chcesz wyłączyć? – hookedonwinter

+2

Możesz po prostu pobrać JS, zmodyfikować go lokalnie i uruchomić tam? – Rudu

+0

Wysłałem rozwiązanie tutaj: http: // stackoverflow.com/a/9699686/6355 Ponieważ jest to niewiele więcej niż link tutaj, to znowu: http://userscripts.org/scripts/show/125936 – Sarien

Odpowiedz

0

Możesz użyć tak zwanej skryptozakładki.

kompilacji js chcesz uruchomić na innym miejscu: your.js

Złóż stronę HTML z następującego kodu:

<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> 

Wymień /url/to/your.js ze ścieżką pliku js.

Załaduj tę małą stronę do przeglądarki i przeciągnij link do paska zakładek.

Przejdź do strony, którą chcesz zhackować, i kliknij zakładkę, którą właśnie utworzyłeś.
To ładuje your.js na stronie i uruchamia kod.

Uwaga: the ?'+(Math.random()) część jest uniknięcie twoi js są buforowane, nie jest to obowiązkowe, ale jest to pomocne, gdy rozwijać your.js

7

Odpowiedź zależy od szczegółów, które nie zostały przewidziane (dokładna stronie i linią od kod byłoby najlepiej), ale oto jak to zrobić w ogóle:

  1. Jeśli wykraczająca kod JS nie zapala od razu (pożary po DOMContentLoaded), a następnie można użyć G reasemonkey, aby zastąpić nieprawidłowy kod. EG:

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

    Zrobione.

  2. Jeśli kod JS odpala natychmiast, staje się bardziej skomplikowany.
    Najpierw pobierz kopię skryptu i wprowadź żądaną zmianę. Zapisz to lokalnie.

  3. Czy obrazujący skrypt znajduje się w pliku, czy jest na stronie głównej HTML (<script src="Some File> versus <script>Mess O' Code</script>)?

  4. Jeśli skrypt znajduje się w pliku, zainstaluj Adblock Plus i użyj go do zablokowania ładowania tego skryptu. Następnie użyj Greasemonkey, aby dodać zmodyfikowany kod do strony. EG:

    var scriptNode   = document.createElement ("script"); 
    scriptNode.setAttribute ("src", "Point to your modified JS file here."); 
    document.head.appendChild (scriptNode); 
    
  5. Jeśli skrypt jest na głównej stronie HTML, a następnie zainstalować albo NoScript (najlepsze) lub YesScript i używać go w celu zablokowania JavaScript z tej witryny.
    Oznacza to, że będziesz musiał użyć Greasemonkey, aby zastąpić wszystkie skrypty z tej strony, które chcesz uruchomić.

32

Firefox obsługuje obecnie the beforescriptexecute event (od Version 4, released on March 22, 2011) .

Z tym wydarzeniem i the // @run-at document-start directive, Firefox i Greasemonkey wydają się teraz robić dobrą robotę przechwytującą konkretne tagi <script>.

To nadal nie jest możliwe w przypadku Chrome + Tampermonkey. Aby uzyskać wszystko oprócz Firefox + Greasemonkey, będziesz musiał użyć technik, jak pokazano w innych odpowiedziach, poniżej, napisać pełne rozszerzenie przeglądarki.

The checkForBadJavascripts function to hermetyzuje. Na przykład załóżmy, że strona miała <script> tag tak:

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

Można użyć checkForBadJavascripts tak:

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

dostać dużo ładniejszy wiadomość. (^_^)
Zobacz dokumentację w wersji checkForBadJavascripts, aby uzyskać więcej informacji.


Aby zobaczyć demonstrację w kompletnym skrypcie, należy najpierw odwiedzić stronę this page at jsBin. Zobaczysz 3 wiersze tekstu, dwa z nich dodane przez JS.

Teraz, install this script (View source; jest również poniżej) i ponownie odwiedzić stronę. Zobaczysz, że skrypt GM usunął jeden zły znacznik i zastąpił go innym naszym "dobrym" JS.


Należy pamiętać, że tylko Firefox obsługuje zdarzenie beforescriptexecute. Został on usunięty ze specyfikacji HTML5 bez określonej równoważnej możliwości.



Kompletny przykład skrypt GM (Taki sam jak ten na GitHub i jsBin):

Biorąc pod uwagę to 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> 


Użyj tego Greasemonkey skrypt:

// ==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

Przed/afterscriptexecute zostały usunięte ze standardu HTML5 w kwietniu 2016 r. z powodu FF jako jedynego sprzedawca do wdrożenia, niestety. – imoatama

1

Korzystanie z klucza TamperMonkey? Wszystko, co musisz dodać pod swoim // @grant w nagłówku TamperMonkey to // @require http://urlofyoursite.com/myfile.js. Na przykład, tutaj jest górna część mojej sztuczki 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== 
Powiązane problemy