0

タグが削除された後もスクリプトが実行されるのはなぜですか?

セレクターに「スタイル」ではなく「スクリプト」を誤って入力したときに、jQuery をテストしてスタイルを削除し、タグをリンクして CSS スタイルを削除しました。しかし、これらのタグで定義されたスクリプトは引き続き実行されます。何故ですか?

JS のサンプルは次のとおりです。

//assume foo is defined
foo();

var scripts = Array.prototype.slice.call(document.getElementsByTagName('script')),
    current;

//remove all scripts
while (scripts.length) {
    current = scripts.pop();
    current.parentNode.removeChild(current);
}

//foo still works
foo();​

jQuery と同じこと:

foo();

$('script').remove();

foo();​

副次的な質問: この方法で削除されない場合、どうなりますか?

4

4 に答える 4

4

これらは、スクリプトが最初に解析されるときにメモリに読み込まれるため、実行されます。

undefined無効にするには、何でも設定できます。

于 2012-04-30T12:36:58.933 に答える
1

あなたはこれを試すことができます:

$('script:not([src], [type])', document).remove();
window.foo = false; // or, window.foo = undefined;
于 2012-04-30T13:18:03.310 に答える
1

最初のスクリプトは既に実行されており、2 番目のスクリプトは、削除しようとするまでに読み込まれています。次のようになります。

<script>
function foo(){
alert('foo');
}
</script>



<script type='text/javascript'>//<![CDATA[ 

foo();

var scripts = Array.prototype.slice.call(document.getElementsByTagName('script')),
    current;

while (scripts.length) {
    current = scripts.pop();
    current.parentNode.removeChild(current);
}

foo();
//]]>  

</script>
于 2012-04-30T12:38:12.580 に答える
0

タグは、実行されるコードを定義する<script>だけです-たとえば

foo = function() { alert("Yay!"); };

上記の機能を に割り当てますwindow.foo。特定のコード ブロックの影響を元に戻すための防弾の方法 (非常識なトランザクション メモリの実装は別として、おそらく) は思いつきません。(この問題には名前があると直感しています。)

もちろん、限定的な実装が必要な場合は、の実行のwindow前後にキーを記録し、必要に応じてその実行中に作成されたキーを記録できます。しかし、繰り返しになりますが、防弾ではありません。<script>delete

于 2012-04-30T12:39:01.850 に答える