Interrompere l’esecuzione della funzione Javascript (lato client) o modificarla

Voglio interrompere l’esecuzione di una singola riga da un sito, in modo che l’intera pagina venga letta dal browser eccetto quella singola riga. O il browser può semplicemente saltare l’esecuzione di tale funzione javascript.

O

È il modo in cui posso modificare il javascript in qualche modo in modo che la funzione di generazione casuale numero in javascript non genera un numero casuale, ma i numeri che voglio …

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

Firefox attualmente supporta l’evento beforescriptexecute (dalla versione 4, rilasciata il 22 marzo 2011 ) .

Con questo evento e la direttiva // @run-at document-start , Firefox e Greasemonkey sembrano fare un buon lavoro intercettando specifici tag .

Questo non è ancora ansible 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.

La funzione checkForBadJavascripts incapsula questo. Ad esempio, supponiamo che la pagina abbia un tag modo:

  

È ansible utilizzare checkForBadJavascripts modo:

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

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


Per vedere una dimostrazione in uno script completo, visita prima questa pagina su jsBin . Vedrai 3 righe di testo, due aggiunte da JS.

Ora, installa questo script ( Visualizza sorgente , è anche sotto) e rivisita la pagina. Vedrai che lo script GM ha eliminato un tag errato e ne ha sostituito un altro con il nostro JS "buono".


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



Esempio di script GM completo (uguale a quello di GitHub e jsBin):

Dato questo HTML:

    

I'm some initial text.

Usa questo script di 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); } 

La risposta dipende dai dettagli che non sono stati forniti (La pagina e la riga di codice esatte sarebbero le migliori), ma ecco come lo si fa in generale:

  1. Se il codice JS incriminato non viene DOMContentLoaded immediatamente (Spara dopo DOMContentLoaded ), è ansible utilizzare Greasemonkey per sostituire il codice incriminato. PER ESEMPIO:

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

    Fatto.

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

  3. Lo script incriminato è in un file o è nella pagina principale HTML (

    site stats