很多時候我們都會在網(wǎng)頁上的JavaScript中使用document.write來寫入一些東西,有的時候可能因?yàn)槲覀儫o法改變某一部分HTML而不得不使用這樣的辦法,也有的時候是因?yàn)樵谶M(jìn)行跨應(yīng)用的腳本調(diào)用。
在前些日子的對Razor模板引擎向JavaScript移植進(jìn)行研究的過程中,我發(fā)現(xiàn)如果使用document.write輸出的內(nèi)容中包含了調(diào)用外部的JavaScript的<script>標(biāo)記,就可能出現(xiàn)一點(diǎn)問題——在這里面被調(diào)用的外部JavaScript可能會在不適當(dāng)?shù)臅r間被執(zhí)行,對于IE和Opera來說,就是當(dāng)write的參數(shù)中的所有其它部分內(nèi)容都被解析之后,這些外部的JavaScript才會執(zhí)行。
而在進(jìn)一步研究中我又發(fā)現(xiàn),對于Chrome和Safari這兩個使用了WebKit網(wǎng)頁排版引擎的瀏覽器來說,如果外部調(diào)用的JavaScript中再次調(diào)用document.write來寫入另一個調(diào)用外部JavaScript的<script>標(biāo)記,則第二次調(diào)用的外部JavaScript不會被執(zhí)行,而之后的一些內(nèi)容也會被打亂——實(shí)際情況其實(shí)要稍微復(fù)雜一點(diǎn),跟第二級、第三級document.write調(diào)用的參數(shù)中的具體內(nèi)容有關(guān),因?yàn)闀r間和精力的關(guān)系我沒有辦法作更具體的測試了。
在經(jīng)過這些研究以后,幾大主流瀏覽器中唯一幸存的、能正確處理所有document.write調(diào)用的,就只有Firefox了。
Firefox的一種偽“多線程”事件處理的特性一直是讓我很不見待的東西,這件事也算是對“各有所長”的一個佐證吧。
想要了解這個問題所引發(fā)的種種現(xiàn)象,可以下載write-test.zip,解壓之后用各種瀏覽器打開其中的write-test.htm。
這幾天我一直在嘗試編寫一個替用函數(shù)來解決這個問題,目前已經(jīng)能順利通過上面那個鏈接中的測試了。
如果接下來的幾天之內(nèi)沒有發(fā)現(xiàn)什么明顯的問題,我會把它發(fā)在博客上供大家參考。