根本的區別是,IE執行腳本元素在第一時間將其添加到父元素節點的childNodes,不管父元素是否實際在文檔中。其他瀏覽器僅在將腳本添加到文檔的childNodes樹中的節點時才執行腳本。
jQuery的domManip
函數(線的jQuery 1.3.2的524),這是由append
和其它類似jQuery方法調用,試圖要巧和用於它發現在最終的已解析的HTML任何<script>
元素調用evalScript
,以執行腳本(通過爲外部腳本執行AJAX請求)。 (實際的腳本元素已經從解析的childNodes中移除,以阻止它們在插入到文檔中時被執行,大概是這樣,當包含它們的內容被一次性地添加到多個元素中時,腳本纔會被執行一次。)
但是,因爲前面的clean
函數在解析HTML時將腳本元素附加到包裝div,因此IE將已經執行腳本。所以你會得到兩次處決。
要做的最好的事情是避免使用domManip
函數,如append
與HTML字符串,當你做任何與腳本。實際上,忘記把你的內容放入一個序列化的HTML字符串中,然後讓jQuery來解析它;只是做了更可靠平原DOM方法:
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操作的任何東西它應該修復了瀏覽器的bug,但愚蠢的正則表達式處理在我看來,可能因爲它解決了導致許多問題)
這個初始呼叫
順便說一句:
document.write(unescape("%3Cscript src='js_test1.js' type='text/javascript'%3E%3C/script%3E"));
你不需要聯合國這裏披肩;我不知道爲什麼這麼多人這樣做。內聯腳本中需要避免使用</
,因爲它會結束<script>
標記,並且如果您正在執行XHTML <
和&
也應該避免(如果您使用的是CDATA包裝器,則爲]]>
),但是更容易盡一切只用JavaScript字符串字面量的方式:
document.write('\x3Cscript src="js_test1.js" type="text/javascript">\x3C/script>"));
謝謝你這個非常透徹的答案。我確實已經回到了更傳統的DOM方式,現在它運行良好。 關於最初調用中的無法使用的問題:如果我沒有記錯的話,我複製了Google Analytics用來包含腳本的代碼,根據(也許是錯誤的)假設,如果有人知道如何強健地包含遠程JavaScript,那麼GA人。感謝您的澄清。 – stiang