10

実行される前にスクリプト要素を削除するにはどうすればよいですか?

DOMNodeInserted イベントを使おうと思ったのですが、どうやらスクリプト要素をキャッチしないようです。また、次のような jQuery livequery プラグインを使用してみました。

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

スクリプト要素は削除されましたが、実行された後です。

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

スクリプトの内容を削除して再作成せずに、実行前に変更する方法があればさらに良いでしょう。

4

2 に答える 2

17

スクリプト要素を削除しても何も起こりません。何らかの方法でスクリプト要素にアクセスできる場合、それはかなり前に実行されたものであり、削除しても効果はありません。

したがって、これを回避する必要があります。スクリプト要素が次のようにページの上部にある場合:

<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、何らかの理由で呼び出しを完全に無視しています。

于 2012-07-20T10:42:44.020 に答える
-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();
于 2012-07-17T18:27:47.797 に答える