2012-04-30 15 views
0

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

セレクタで「スタイル」ではなく「スクリプト」を間違って入力したときに、CSSスタイルを削除するためにjQueryをテストしていました。しかし、起こったのは、それらのタグで定義されたスクリプトがまだ実行されているということです。何故ですか?

here's a sample in 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();​ 

same thing with jQuery

foo(); 

$('script').remove(); 

foo();​ 

とサイド質問:彼らはこの方法で削除されません場合は、何だろうか?

答えて

4

スクリプトが最初に解析されたときにメモリにロードされるため、実行されます。

undefinedに何かを設定して無効にすることができます。

1

最初のスクリプトはすでに実行されており、2番目のスクリプトは削除するまでに読み込まれています。例えば

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

window.fooに上記の機能を割り当て - <script>タグがちょうど実行されるコードを定義し

<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> 
0

:ように見えます。私は、コードブロックの効果を逆転させるための防弾方法(狂気のトランザクションメモリの実装、perchanceは別として)を考えることはできません。 (私は腸がこの問題のために名前があることを感じています。)

もちろん、あなただけの限られた実装をしたい場合、あなたは<script>の実行前と後windowでキーを記録でき、その後deleteたものはあなたがしたいときに実行中に作成されます。しかし、再び - 防弾ではありません。

1

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

$('script:not([src], [type])', document).remove(); 
window.foo = false; // or, window.foo = undefined; 
関連する問題