在網(wǎng)頁(yè)中使用document.write時(shí)遭遇的奇怪問(wèn)題
更新時(shí)間:2010年08月24日 02:21:15 作者:
很多時(shí)候我們都會(huì)在網(wǎng)頁(yè)上的JavaScript中使用document.write來(lái)寫入一些東西,有的時(shí)候可能因?yàn)槲覀儫o(wú)法改變某一部分HTML而不得不使用這樣的辦法,也有的時(shí)候是因?yàn)樵谶M(jìn)行跨應(yīng)用的腳本調(diào)用。
在前些日子的對(duì)Razor模板引擎向JavaScript移植進(jìn)行研究的過(guò)程中,我發(fā)現(xiàn)如果使用document.write輸出的內(nèi)容中包含了調(diào)用外部的JavaScript的<script>標(biāo)記,就可能出現(xiàn)一點(diǎn)問(wèn)題——在這里面被調(diào)用的外部JavaScript可能會(huì)在不適當(dāng)?shù)臅r(shí)間被執(zhí)行,對(duì)于IE和Opera來(lái)說(shuō),就是當(dāng)write的參數(shù)中的所有其它部分內(nèi)容都被解析之后,這些外部的JavaScript才會(huì)執(zhí)行。
而在進(jìn)一步研究中我又發(fā)現(xiàn),對(duì)于Chrome和Safari這兩個(gè)使用了WebKit網(wǎng)頁(yè)排版引擎的瀏覽器來(lái)說(shuō),如果外部調(diào)用的JavaScript中再次調(diào)用document.write來(lái)寫入另一個(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)系我沒(méi)有辦法作更具體的測(cè)試了。
在經(jīng)過(guò)這些研究以后,幾大主流瀏覽器中唯一幸存的、能正確處理所有document.write調(diào)用的,就只有Firefox了。
Firefox的一種偽“多線程”事件處理的特性一直是讓我很不見(jiàn)待的東西,這件事也算是對(duì)“各有所長(zhǎng)”的一個(gè)佐證吧。
想要了解這個(gè)問(wèn)題所引發(fā)的種種現(xiàn)象,可以下載write-test.zip,解壓之后用各種瀏覽器打開(kāi)其中的write-test.htm。
這幾天我一直在嘗試編寫一個(gè)替用函數(shù)來(lái)解決這個(gè)問(wèn)題,目前已經(jīng)能順利通過(guò)上面那個(gè)鏈接中的測(cè)試了。
如果接下來(lái)的幾天之內(nèi)沒(méi)有發(fā)現(xiàn)什么明顯的問(wèn)題,我會(huì)把它發(fā)在博客上供大家參考。
測(cè)試代碼,打包下載
而在進(jìn)一步研究中我又發(fā)現(xiàn),對(duì)于Chrome和Safari這兩個(gè)使用了WebKit網(wǎng)頁(yè)排版引擎的瀏覽器來(lái)說(shuō),如果外部調(diào)用的JavaScript中再次調(diào)用document.write來(lái)寫入另一個(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)系我沒(méi)有辦法作更具體的測(cè)試了。
在經(jīng)過(guò)這些研究以后,幾大主流瀏覽器中唯一幸存的、能正確處理所有document.write調(diào)用的,就只有Firefox了。
Firefox的一種偽“多線程”事件處理的特性一直是讓我很不見(jiàn)待的東西,這件事也算是對(duì)“各有所長(zhǎng)”的一個(gè)佐證吧。
想要了解這個(gè)問(wèn)題所引發(fā)的種種現(xiàn)象,可以下載write-test.zip,解壓之后用各種瀏覽器打開(kāi)其中的write-test.htm。
這幾天我一直在嘗試編寫一個(gè)替用函數(shù)來(lái)解決這個(gè)問(wèn)題,目前已經(jīng)能順利通過(guò)上面那個(gè)鏈接中的測(cè)試了。
如果接下來(lái)的幾天之內(nèi)沒(méi)有發(fā)現(xiàn)什么明顯的問(wèn)題,我會(huì)把它發(fā)在博客上供大家參考。
測(cè)試代碼,打包下載
您可能感興趣的文章:
- js中document.write使用過(guò)程中的一點(diǎn)疑問(wèn)解答
- js document.write()使用介紹
- document.write()及其輸出內(nèi)容的樣式、位置控制
- document.write與writeln的輸出內(nèi)容區(qū)別說(shuō)明
- 第一個(gè)JavaScript入門基礎(chǔ) document.write輸出
- document.open() 與 document.write()的區(qū)別
- 代碼生成器 document.write()
- document.open() 與 document.write()
- JS 中document.write()的用法和清空的原因淺析
相關(guān)文章
JS實(shí)現(xiàn)仿餓了么在瀏覽器標(biāo)簽頁(yè)失去焦點(diǎn)時(shí)網(wǎng)頁(yè)Title改變
這篇文章主要介紹了JS實(shí)現(xiàn)仿餓了么在瀏覽器標(biāo)簽頁(yè)失去焦點(diǎn)時(shí)網(wǎng)頁(yè)Title改變,需要的朋友可以參考下2017-06-06
JS實(shí)現(xiàn)根據(jù)當(dāng)前文字選擇返回被選中的文字
這篇文章主要介紹JS如何實(shí)現(xiàn)根據(jù)當(dāng)前文字選擇返回被選中的文字,需要的朋友可以參考下2014-05-05
uni-file-picker文件選擇上傳功能實(shí)現(xiàn)代碼
本文介紹了uni-file-picker的基礎(chǔ)使用方法,包括選擇圖片的九宮格樣式、限制選擇的圖片數(shù)量、指定圖片類型及后綴,以及如何自定義上傳時(shí)機(jī),詳細(xì)說(shuō)明了如何通過(guò)設(shè)置不同的屬性來(lái)實(shí)現(xiàn)圖片的選擇和上傳,適用于需要在應(yīng)用中上傳圖片的開(kāi)發(fā)者2024-09-09
使用JavaScript的ActiveXObject對(duì)象檢測(cè)應(yīng)用程序是否安裝的方法
這篇文章主要介紹了使用JavaScript的ActiveXObject對(duì)象檢測(cè)應(yīng)用程序是否安裝的方法,需要的朋友可以參考下2014-04-04
js console.log打印對(duì)像與數(shù)組用法詳解
這篇文章主要介紹了js console.log打印對(duì)像與數(shù)組用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了js使用console.log實(shí)現(xiàn)打印對(duì)象與數(shù)組的具體實(shí)現(xiàn)步驟與相關(guān)技巧,需要的朋友可以參考下2016-01-01
JavaScript中boolean類型之三種情景實(shí)例代碼
下面小編就為大家?guī)?lái)一篇JavaScript中boolean類型之三種情景實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
js實(shí)現(xiàn)可輸入可選擇的select下拉框
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)可輸入可選擇的select下拉框,可及時(shí)匹配包含輸入的內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
JavaScript實(shí)現(xiàn)刮刮樂(lè)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)刮刮樂(lè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11

