2010-10-19 2 views
22

Voglio interrompere l'esecuzione di una singola riga da un sito, in modo che l'intera pagina venga letta dal browser ad eccezione di quella singola riga. O il browser può semplicemente saltare l'esecuzione di tale funzione javascript.Interrompere l'esecuzione della funzione Javascript (lato client) o modificarlo

O

C'è modo mi è possibile modificare il javascript in qualche modo che il numero casuale funzione generatrice in javascript non generano numeri casuali, ma i numeri che voglio ...

Non ho accesso a il sito su cui è ospitato lo script, quindi tutto ciò deve essere fatto lato client.

+1

Puoi mostrarci il codice e indicare la linea che vuoi disabilitare? – hookedonwinter

+2

Si può semplicemente scaricare il JS, modificarlo localmente ed eseguirlo lì? – Rudu

+0

Ho pubblicato una soluzione qui: http: // StackOverflow.it/a/9699686/6355 Poiché è poco più di un collegamento, eccola di nuovo: http://userscripts.org/scripts/show/125936 – Sarien

risposta

0

È possibile utilizzare quello che viene chiamato un bookmarklet.

Costruire il file js che si desidera eseguire sull'altro sito: your.js

Fai una pagina HTML con il seguente codice:

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

Sostituire /url/to/your.js con il percorso del file js.

Caricare quella piccola pagina nel browser e trascinare il link sulla barra dei segnalibri.

Passare al sito Web che si desidera modificare e fare clic sul segnalibro appena creato.
Questo caricherà your.js nella pagina ed eseguirà il codice.

Nota: la parte ?'+(Math.random()) è quello di evitare i tuoi js memorizzati nella cache, questo non è obbligatorio, ma è utile quando si sviluppa your.js

7

La risposta dipende da dettagli che non sono stati forniti (la pagina esatta e la linea del codice sarebbe meglio), ma ecco come si fa in generale:

  1. Se il codice JS incriminato non scatta subito (Fires dopo DOMContentLoaded), quindi è possibile utilizzare G reasemonkey per sostituire il codice incriminato. EG:

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

    Fatto.

  2. Se il codice JS si attiva immediatamente, diventa più complicato.
    Innanzitutto, prendi una copia dello script e apporta la modifica desiderata. Salvalo localmente.

  3. Lo script offensivo in un file o è nella pagina principale HTML (<script src="Some File> versus <script>Mess O' Code</script>)?

  4. Se lo script è in un file, installare Adblock Plus e utilizzarlo per bloccare il caricamento di tale script. Quindi utilizzare Greasemonkey per aggiungere il codice modificato alla pagina. EG:

    var scriptNode   = document.createElement ("script"); 
    scriptNode.setAttribute ("src", "Point to your modified JS file here."); 
    document.head.appendChild (scriptNode); 
    
  5. Se lo script si trova nella pagina HTML principale, quindi installare sia NoScript (meglio) o YesScript e usarlo per bloccare JavaScript da quel sito.
    Ciò significa che sarà necessario utilizzare Greasemonkey per sostituire tutti gli script, da quel sito, che si desidera eseguire.

32

Firefox supporta attualmente the beforescriptexecute event (come di Version 4, released on March 22, 2011) .

Con tale evento e the // @run-at document-start directive, Firefox e Greasemonkey ora sembrano fare un buon lavoro intercettando specifici tag <script>.

Questo non è ancora possibile per Chrome + Tampermonkey. Per tutto tranne Firefox + Greasemonkey, dovrai usare le tecniche come mostrato nelle altre risposte, di seguito, di scrivere un'estensione completa del browser.

The checkForBadJavascripts function incapsula questo. Per esempio, supponiamo pagina ha avuto un tag <script> in questo modo:

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

si potrebbe usare checkForBadJavascripts in questo modo:

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

per ottenere un messaggio molto più bello. (^_^)
Vedere la documentazione in linea, in checkForBadJavascripts, per ulteriori informazioni.


per vedere una dimostrazione in uno script completo, prima visita this page at jsBin. Vedrai 3 righe di testo, due aggiunte da JS.

Ora, install this script (View source; è anche sotto). E rivisitare la pagina. Vedrai che lo script GM ha eliminato un tag errato e ne ha sostituito un altro con il nostro JS "buono".


Nota che solo Firefox supporta l'evento beforescriptexecute. Ed è stato rimosso dalle specifiche HTML5 senza alcuna capacità equivalente specificata.



completo esempio di script GM (Lo stesso di quello a GitHub e jsBin):

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


Usa questo script 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

prima/afterscriptexecute sono stati rimossi dallo standard HTML5 nell'aprile 2016 a causa del fatto che FF è l'unico fornitore da implementare, sfortunatamente. – imoatama

1

Utilizzo di TamperMonkey? Tutto quello che devi aggiungere sotto il tuo // @grant nell'intestazione di TamperMonkey è // @require http://urlofyoursite.com/myfile.js. Ad esempio, ecco la parte superiore del mio thingie 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==