2012-05-02 18 views
8

¿Cómo puedo eliminar los elementos de script antes de que se estén ejecutando?¿Cómo puedo eliminar los elementos del script antes de que se ejecuten?

Pensé en usar el evento DOMNodeInserted, pero aparentemente no atrapa los elementos del script. También he intentado usar el plugin jQuery livequery así:

$("script").livequery(function() { 
    $(this).remove(); 
}); 

Se hizo quitar el elemento de guión, pero después de que fuera ejecutado.

Estoy buscando una solución de varios navegadores, pero ni siquiera estoy seguro de si eso es posible. Leí acerca de Mutation Observers que parece lo suficientemente cerca, pero no estoy seguro de si puede resolver mi problema.

Sería aún mejor si hubiera una forma de modificar el contenido del script antes de que se ejecute sin eliminarlo ni volver a crearlo.

+2

No conozco una solución, pero tengo una pregunta: ¿Por qué quieres eliminarlas (parece que se agregan debido a un usuario)? Si alguien quiere ejecutar código, ¿también puede usar una consola de JavaScript? –

+0

Modificar el código si puede detectar la secuencia de comandos y evitar que se ejecute debe ser fácil, ya que puede simplemente agarrar el atributo src, cargarlo como texto (en ajax), modificarlo y ejecutarlo.Después de poder ver el DOM con observadores de mutación, para que funcione, el navegador deberá agregar la etiqueta del script antes de cargarlo y ejecutar el archivo, y no pude encontrar ninguna información al respecto. Como si fuera el último, entonces la detección de la inserción de las etiquetas del script será inútil ya que ya se ejecutarán. – GillesC

+0

Solo quería agregar, sin saber el contexto o el problema, que suena como un enfoque extraño para una solución y es un enlace que le da muchos dolores de cabeza. Si explica el contexto, quizás algunos puedan sugerir una solución más inteligente – GillesC

Respuesta

10

La eliminación de un elemento de script no hace nada. Si de alguna manera puede acceder a un elemento de script, se ejecutó hace mucho tiempo y eliminarlo no tendrá ningún efecto.

Así que tenemos que evitarlo. Si el elemento de script se encuentra en la parte superior de la página como esta:

<head> 
    <script src="yourscript.js"></script> 

se puede hacer una petición ajax sincrónica a la misma página, por lo que puede analizar su contenido en un documento nuevo, modificar todas las etiquetas de secuencia de comandos y luego reemplace el documento actual con el documento modificado.

var xhr = new XMLHttpRequest, 
    content, 
    doc, 
    scripts; 

xhr.open("GET", document.URL, false); 
xhr.send(null); 
content = xhr.responseText; 

doc = document.implementation.createHTMLDocument(""+(document.title || "")); 

doc.open(); 
doc.write(content); 
doc.close(); 


scripts = doc.getElementsByTagName("script"); 
//Modify scripts as you please 
[].forEach.call(scripts, function(script) { 
    script.removeAttribute("src"); 
    script.innerHTML = 'alert("hello world");'; 
}); 

//Doing this will activate all the modified scripts and the "old page" will be gone as the document is replaced 
document.replaceChild(document.importNode(doc.documentElement, true), document.documentElement); 

Desafortunadamente, esto no se puede configurar en jsfiddle o jsbin. Pero debería poder copiar y pegar este código exactamente como está en la consola de esta página en google chrome. Debería ver las alertas y cuando inspecciona el dominio en vivo, cada script se modificó.

La diferencia es que estamos ejecutando esto después de que los scripts se hayan ejecutado en la página, por lo que los scripts antiguos aún deberían tener un efecto de trabajo en la página. Es por eso que, para que esto funcione, debe ser el primer script en la página para hacerlo.

Probado para trabajar en google chrome. Firefox está ignorando por completo la llamada doc.write por algún motivo.

-3

no sé lo que está tratando de hacer. Pero es mejor cargarlos a petición en lugar de eliminar en algunas condiciones.

$.getScript('helloworld.js', function() { 
    $("#content").html(' 
      Javascript is loaded successful! 
    '); 
    }); 

Si desea eliminar los scripts antes de su ejecución, no es posible. Pero lo que puede hacer es eliminar la secuencia de comandos programáticamente en una condición & si tiene un problema con las pérdidas de memoria, entonces puede llamar al código siguiente antes de eliminar la secuencia de comandos.

var var1 = 'hello'; 
var cleanAll = function() { 
    delete window.var1; 
    delete window.cleanAll; 
}; 

// unload all resources 
cleanAll(); 
Cuestiones relacionadas