在網頁中使用document.write時遭遇的奇怪問題
更新時間:2010年08月24日 02:21:15 作者:
很多時候我們都會在網頁上的JavaScript中使用document.write來寫入一些東西,有的時候可能因為我們無法改變某一部分HTML而不得不使用這樣的辦法,也有的時候是因為在進行跨應用的腳本調用。
在前些日子的對Razor模板引擎向JavaScript移植進行研究的過程中,我發(fā)現如果使用document.write輸出的內容中包含了調用外部的JavaScript的<script>標記,就可能出現一點問題——在這里面被調用的外部JavaScript可能會在不適當的時間被執(zhí)行,對于IE和Opera來說,就是當write的參數中的所有其它部分內容都被解析之后,這些外部的JavaScript才會執(zhí)行。
而在進一步研究中我又發(fā)現,對于Chrome和Safari這兩個使用了WebKit網頁排版引擎的瀏覽器來說,如果外部調用的JavaScript中再次調用document.write來寫入另一個調用外部JavaScript的<script>標記,則第二次調用的外部JavaScript不會被執(zhí)行,而之后的一些內容也會被打亂——實際情況其實要稍微復雜一點,跟第二級、第三級document.write調用的參數中的具體內容有關,因為時間和精力的關系我沒有辦法作更具體的測試了。
在經過這些研究以后,幾大主流瀏覽器中唯一幸存的、能正確處理所有document.write調用的,就只有Firefox了。
Firefox的一種偽“多線程”事件處理的特性一直是讓我很不見待的東西,這件事也算是對“各有所長”的一個佐證吧。
想要了解這個問題所引發(fā)的種種現象,可以下載write-test.zip,解壓之后用各種瀏覽器打開其中的write-test.htm。
這幾天我一直在嘗試編寫一個替用函數來解決這個問題,目前已經能順利通過上面那個鏈接中的測試了。
如果接下來的幾天之內沒有發(fā)現什么明顯的問題,我會把它發(fā)在博客上供大家參考。
測試代碼,打包下載
而在進一步研究中我又發(fā)現,對于Chrome和Safari這兩個使用了WebKit網頁排版引擎的瀏覽器來說,如果外部調用的JavaScript中再次調用document.write來寫入另一個調用外部JavaScript的<script>標記,則第二次調用的外部JavaScript不會被執(zhí)行,而之后的一些內容也會被打亂——實際情況其實要稍微復雜一點,跟第二級、第三級document.write調用的參數中的具體內容有關,因為時間和精力的關系我沒有辦法作更具體的測試了。
在經過這些研究以后,幾大主流瀏覽器中唯一幸存的、能正確處理所有document.write調用的,就只有Firefox了。
Firefox的一種偽“多線程”事件處理的特性一直是讓我很不見待的東西,這件事也算是對“各有所長”的一個佐證吧。
想要了解這個問題所引發(fā)的種種現象,可以下載write-test.zip,解壓之后用各種瀏覽器打開其中的write-test.htm。
這幾天我一直在嘗試編寫一個替用函數來解決這個問題,目前已經能順利通過上面那個鏈接中的測試了。
如果接下來的幾天之內沒有發(fā)現什么明顯的問題,我會把它發(fā)在博客上供大家參考。
測試代碼,打包下載
相關文章
使用JavaScript的ActiveXObject對象檢測應用程序是否安裝的方法
這篇文章主要介紹了使用JavaScript的ActiveXObject對象檢測應用程序是否安裝的方法,需要的朋友可以參考下2014-04-04

