2012-05-02 9 views
8

Come posso rimuovere gli elementi di script prima che vengano eseguiti?Come posso rimuovere gli elementi di script prima che vengano eseguiti?

Ho pensato di utilizzare l'evento DOMNodeInserted, ma a quanto pare non cattura gli elementi di script. Ho anche provato ad utilizzare il plugin jQuery livequery così:

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

Lo ha fatto rimuovere l'elemento script, ma dopo che è stato eseguito.

Sto cercando una soluzione cross-browser, ma non sono nemmeno sicuro se è possibile. Ho letto di Mutation Observers che sembra abbastanza vicino ma non sono sicuro che possa risolvere il mio problema.

Sarebbe ancora meglio se ci fosse un modo per modificare il contenuto dello script prima che fosse eseguito senza rimuoverlo e ricrearlo.

+2

Non conosco una soluzione, ma ho una domanda: perché vuoi rimuoverli (sembra che vengano aggiunti a causa di un utente)? Se qualcuno vuole eseguire codice, può anche usare una console javascript? –

+0

Modificare il codice se riesci a rilevare lo script e fermarlo dall'esecuzione dovrebbe essere facile, in quanto puoi semplicemente prendere l'attributo src, caricarlo come testo (in ajax), modificarlo ed eseguirlo.Dopo aver visto il DOM con gli osservatori di mutazione, tuttavia, affinché funzioni, il browser dovrà aggiungere il tag dello script prima di caricare ed eseguire il file e non sono riuscito a trovare alcuna informazione al riguardo. Come se fosse il dopo, il rilevamento dell'inserimento dei tag dello script sarà inutile in quanto verranno già eseguiti. – GillesC

+0

Volevo solo aggiungere, senza conoscere il contesto o il problema, che sembra un approccio strano per una soluzione ed è un legame che ti dà molti mal di testa. Se spieghi il contesto, alcuni potrebbero suggerire una soluzione più intelligente. – GillesC

risposta

10

La rimozione di un elemento di script non fa nulla. Se è possibile accedere in qualche modo a un elemento di script, è stato eseguito molto tempo fa e rimuoverlo non avrà alcun effetto.

Quindi abbiamo bisogno di aggirare. Se il vostro elemento script è nella parte superiore della pagina come questa:

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

si potrebbe fare una richiesta AJAX sincrona alla stessa pagina, in modo da poter analizzare il suo contenuto in un nuovo documento, modificare tutti i tag di script e poi sostituire il documento corrente con il documento modificato.

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

Purtroppo questo non può essere impostato in jsfiddle o jsbin. Ma dovresti riuscire a copiare incollare questo codice esattamente come nella console della pagina in google chrome. Dovresti vedere gli avvisi e quando controlli il live dom, ogni script è stato modificato.

La differenza è che stiamo eseguendo questo dopo che gli script sono stati eseguiti sulla pagina, quindi i vecchi script dovrebbero ancora avere un effetto di lavoro sulla pagina. Ecco perché, per far funzionare tutto questo, devi essere il primo script della pagina a farlo.

Testato per funzionare in google chrome. Firefox ignora completamente la chiamata doc.write per qualche motivo.

-3

non so cosa stai cercando di fare. Ma è meglio caricarli su richiesta piuttosto che cancellare in alcune condizioni.

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

Se si desidera rimuovere gli script prima dell'esecuzione, non è possibile. Ma quello che puoi fare è rimuovere lo script programmaticamente su una condizione & se hai un problema con perdite di memoria, quindi puoi chiamare sotto il codice prima di rimuovere lo script.

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

// unload all resources 
cleanAll(); 
Problemi correlati