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