루트의 차이 IE 스크립트 요소에게 그것은 부모 요소의 childNodes에 추가됩니다 처음 실행하는 것입니다, 부모 요소가 실제로 문서에 있는지 여부에 관계없이 다른 브라우저는 childNodes의 문서 트리 안의 노드에 추가 될 때만 스크립트를 실행합니다.
jQuery의 domManip
기능 append
및 기타 유사한 jQuery를 메소드에 의해 호출되고, 영리 시도하고, 최종 해석 된 HTML에서 찾은 <script>
요소 evalScript
호출 (jQuery를 1.3.2의 524 라인)의 실행에 스크립트 (외부 스크립트에 필요한 경우 AJAX 요청을 수행하여). (실제 스크립트 요소는 파싱 된 childNodes에서 제거되어 문서 삽입시 실행되지 않게됩니다. 따라서 스크립트를 포함하는 내용이 여러 요소에 동시에 추가 될 때 스크립트가 한 번만 실행됩니다.)
그러나 이전의 clean
함수는 HTML을 구문 분석하는 동안 스크립트 요소를 래퍼 div에 추가했기 때문에 IE는 이미 스크립트를 실행했을 것입니다. 그래서 당신은 두 번의 처형을 받게됩니다.
가장 좋은 방법은 append
과 같은 기능을 스크립트를 사용하여 HTML 문자열과 함께 사용하지 않는 것입니다.
사실, 직렬화 된 HTML 문자열에 내용을 넣고 jQuery로 파싱하는 것을 잊어 버리십시오.
이 이
var s= document.createElement('script');
s.type= 'text/javascript';
s.charset= 'UTF-8';
s.src= 'js_test2.js';
document.getElementById('some_container').appendChild(s);
이 이 이
이 (솔직히하려면 clean
함수의 위-옵니다 소스 코드를 본 후, 내가 jQuery의 사용에 대한 심각한 의문에 봉착 HTML 문자열을 기반 : 단지 그것을 훨씬 더 신뢰할 수있는 일반 DOM 방법을 . 아무것도 DOM 조작은 전혀 브라우저 버그를 수정하기로했다,하지만 바보 - 정규식 처리는 나에게 그것이 해결 가능한 많은 문제를 일으킬 가능성이 보인다)이 초기 호출에 덧붙여
:.
document.write(unescape("%3Cscript src='js_test1.js' type='text/javascript'%3E%3C/script%3E"));
을
당신은 유엔을 필요로하지 않습니다. 여기 케이프; 왜 그렇게 많은 사람들이하는지 모르겠다. 시퀀스 </
은 인라인 스크립트에서 피할 필요가 있습니다. <script>
태그가 끝나야하고 XHTML을 사용하는 경우 <
및 &
은 피해야합니다 (CDATA 래퍼를 사용하는 경우 ]]>
). 더 쉬운 방법이 있습니다. 바로 자바 스크립트 문자열 리터럴로 모든 일을 방법 :
document.write('\x3Cscript src="js_test1.js" type="text/javascript">\x3C/script>"));
매우 철저한 대답에 감사드립니다. 나는 더 전통적인 DOM 방식으로 되돌아 왔고, 지금은 잘 작동한다. 초기 호출에서 이스케이프 해제에 관해서 : 올바르게 기억하면 Google 애널리틱스가 스크립트를 포함시키기 위해 사용하는 코드를 복사했습니다. 누군가가 원격 자바 스크립트를 강력하게 포함하는 방법을 알고 있다면 GA 사람들 . 해명 해줘서 고마워. – stiang