2010-10-19 23 views
22

Quiero detener la ejecución de una sola línea desde un sitio, de modo que el navegador lea toda la página, excepto esa única línea. O el navegador puede simplemente omitir la ejecución de esa función javascript.Detener la ejecución de la función Javascript (lado del cliente) o modificarlo

O

¿Hay manera que puedo modificar el código JavaScript de alguna manera que el número aleatorio función que genera en javascript no generan números aleatorios, pero los números que quiero ...

no tengo acceso a el sitio en el que se encuentra el script, por lo que todo esto debe hacerse desde el lado del cliente.

+1

¿Puede mostrarnos el código y señalar la línea que desea deshabilitar? – hookedonwinter

+2

¿Podría simplemente descargar el JS, modificarlo localmente y ejecutarlo allí? – Rudu

+0

He publicado una solución aquí: http: // stackoverflow.com/a/9699686/6355 Dado que es poco más que un enlace aquí va otra vez: http://userscripts.org/scripts/show/125936 – Sarien

Respuesta

0

Puede usar lo que se denomina bookmarklet.

construye una lista de los js que desea ejecutar en el otro sitio: your.js

Hacer una página HTML con el siguiente código:

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

Reemplazar /url/to/your.js con la ruta de su archivo js.

Cargue esa página pequeña en su navegador y arrastre y suelte el enlace a su barra de marcadores.

Vaya al sitio web que desea hackear y haga clic en el marcador que acaba de crear.
Esto cargará your.js en la página y ejecutará el código.

Nota: la parte ?'+(Math.random()) es evitar sus js que se almacenan en caché, esto no es obligatorio pero es muy útil cuando se desarrolla your.js

7

La respuesta depende de detalles que no estaban previstos (la página exacta y la línea de código sería mejor), pero aquí es cómo lo hace en general:

  1. Si el código JS infractor no se dispara de inmediato (incendios después de DOMContentLoaded), entonces se puede utilizar G reasemonkey para reemplazar el código ofensivo. EG:

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

    Listo.

  2. Si el código JS se dispara inmediatamente, entonces se vuelve más complicado.
    Primero, tome una copia del script y haga el cambio deseado. Guarde esto localmente

  3. ¿Es el guión ofensivo en un archivo o está en la página principal HTML (<script src="Some File> versus <script>Mess O' Code</script>)?

  4. Si el script está en un archivo, instale Adblock Plus y úselo para bloquear la carga de ese script. Luego use Greasemonkey para agregar su código modificado a la página. EG:

    var scriptNode   = document.createElement ("script"); 
    scriptNode.setAttribute ("src", "Point to your modified JS file here."); 
    document.head.appendChild (scriptNode); 
    
  5. Si el script se encuentra en la página principal de HTML, a continuación, instalar ya sea NoScript (mejor) o YesScript y lo utilizan para bloquear JavaScript de ese sitio.
    Esto significa que luego necesitará usar Greasemonkey para reemplazar todos los scripts de ese sitio que desee ejecutar. Actualmente

32

Firefox soporta the beforescriptexecute event (a partir de Version 4, released on March 22, 2011) .

Con ese evento y the // @run-at document-start directive, Firefox y Greasemonkey ahora parecen hacer un buen trabajo interceptando etiquetas específicas <script>.

Esto todavía no es posible para Chrome + Tampermonkey. Para cualquier cosa que no sea Firefox + Greasemonkey, tendrá que utilizar las técnicas que se muestran en las otras respuestas, a continuación, de escribir una extensión completa del navegador.

The checkForBadJavascripts function encapsula esto. Por ejemplo, supongamos que la página tenía una etiqueta <script> así:

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

usted podría utilizar checkForBadJavascripts así:

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

para obtener un mensaje mucho más agradable. (^_^)
Consulte la documentación en línea, en checkForBadJavascripts, para obtener más información.


Para ver una demostración en un guión completo, primera visita this page at jsBin. Verá 3 líneas de texto, dos de ellas agregadas por JS.

Ahora, install this script (View source; también está debajo) y revise la página. Verá que el script GM borró una etiqueta incorrecta y reemplazó a otra con nuestro "buen" JS.


en cuenta que sólo Firefox apoya el evento beforescriptexecute. Y se eliminó de las especificaciones HTML5 sin una capacidad equivalente especificada.



completo ejemplo de script GM (el mismo que el que está en GitHub y jsBin):

Teniendo en cuenta este código 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> 


Utilice este script de 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 fueron eliminados del estándar HTML5 en abril de 2016 debido a que FF es el único proveedor para implementar, desafortunadamente. – imoatama

1

¿Cómo utilizar TamperMonkey? Todo lo que necesita agregar debajo de su // @grant en el encabezado de TamperMonkey es // @require http://urlofyoursite.com/myfile.js. Por ejemplo, aquí está la parte superior de mi thingie de 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== 
Cuestiones relacionadas