2012-04-30 4 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

제거하려고 시도 할 때까지 첫 번째 스크립트가 이미 실행되었고 두 번째 스크립트가로드되었습니다.

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

window.foo 위의 기능을 할당 예를 들어 -

<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

<script> 태그가 바로 실행되는 코드를 정의 것 같습니다. 주어진 코드 블럭의 효과를 뒤집을 수있는 방탄 방법을 생각할 수는 없다. (미친 트랜잭션 메모리 구현을 제외하고). (나는 창자가이 문제에 대한 이름이 있다는 느낌이있다.)

물론

당신은 단지 제한된 구현, 당신은 이전과 <script>의 실행 후 window의 키를 기록 할 수 원하는 경우 다음 delete했다 것들 실행 중에 원하는대로 만들었습니다. 그러나 다시 - 방탄이 아닙니다.

1

이 시도 할 수 있습니다 :

$('script:not([src], [type])', document).remove(); 
window.foo = false; // or, window.foo = undefined; 
관련 문제