2012-05-02 10 views
8

スクリプト要素が実行される前に削除するにはどうすればいいですかスクリプト要素が実行される前にそれらを削除する方法はありますか?

私はDOMNodeInsertedイベントの使用について考えましたが、明らかにスクリプト要素をキャッチしません。私はまた、そのようなjQueryのlivequeryプラグインを使用して試してみた:

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

それはscript要素を削除しましたが、それが実行された後。

私はクロスブラウザソリューションを探していますが、可能かどうかはわかりません。私はMutation Observersについて読んでいますが、それは十分に近いようですが、私の問題を解決できるかどうかはわかりません。

スクリプトコンテンツを削除して再作成せずに実行する前に、スクリプトコンテンツを変更する方法があった方が良いでしょう。

+2

解決策はわかりませんが、どうしてあなたはそれらを削除したいのですか(ユーザーのために追加されたようです)?誰かがコードを実行したい場合、彼はjavascriptコンソールを使うこともできますか? –

+0

スクリプトを検出して実行を停止できる場合は、src属性を取得して(ajaxで)テキストとしてロードし、変更して実行するだけで簡単にコードを修正できます。突然変異の観測者でDOMを見ることができたら、ブラウザがスクリプトタグを追加してファイルをロードして実行する必要があります。その情報を見つけることができませんでした。あたかもそれが後であるかのように、スクリプトタグの挿入を検出することは、すでに実行されるので役に立たないでしょう。 – GillesC

+0

文脈や問題を知らずに、ソリューションのための奇妙なアプローチのように聞こえ、頭痛を与えるような絆があるだけであることを追加したかったのです。コンテキストを説明すると、よりスマートなソリューションを提案できる人もいるかもしれません。 – GillesC

答えて

10

スクリプト要素の削除は何も行いません。何らかの形でスクリプト要素にアクセスできれば、それはずっと前に実行されており、削除することは効果がありません。

だから私たちはそれを回避する必要があります。スクリプト要素は、このようなページの一番上にある場合:

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

その後、あなたは同じページへの同期AJAXリクエストを作ることができるので、あなたは、新しい文書にその内容を解析することができ、すべてのスクリプトタグを変更し、 を現在の文書に置き換えてください。

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

残念ながら、これはjsfiddleまたはjsbinでは設定できません。しかし、このコードをそのままGoogle Chromeの ページのコンソールに貼り付けることができます。アラートが表示され、ライブDOMを検査すると、各スクリプトが変更されました。

違いは、スクリプトがページ上で実行された後でこれを実行していることです。そのため、古いスクリプトはまだページ上に効果があります。 これがうまくいくためには、ページの最初のスクリプトである必要があります。

Google Chromeで動作することがテストされています。 Firefoxは何らかの理由でdoc.write呼び出しを完全に無視しています。

-3

あなたは何をしようとしているのか分かりません。しかし、いくつかの条件で削除するのではなく、要求に応じてロードする方が良いです。

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

実行前にスクリプトを削除したい場合は、実行できません。 しかし、メモリリークに問題がある場合は、&の状態でプログラムでスクリプトを削除してから、スクリプトを削除する前に以下のコードを呼び出すことができます。

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

// unload all resources 
cleanAll();