javascript高級(jí)程序設(shè)計(jì)講到IE中的錯(cuò)誤時(shí)提到操作中止(operation shorted)這個(gè)概念:
在修改尚未加載完成的頁(yè)面會(huì)發(fā)生錯(cuò)誤。
示例代碼為:
<body>
<p></p>
<p>
<script>
document.body.appendChild(document.createElement("p"));
</script>
</p>
</body>
當(dāng)<script>被包含在某元素中,且JS代碼要使用DOM方法修改其父元素或祖先元素,會(huì)發(fā)生操作中止錯(cuò)誤(因?yàn)橹荒苄薷囊呀?jīng)加載完的元素)。
而改為
document.body.insertChild(document.createElement("p"),document.body.firstChild);
就能避免錯(cuò)誤。
說(shuō)是新<p>添加到document.body開(kāi)頭而不是末尾,就沒(méi)有錯(cuò)誤。
看了過(guò)后就不太理解文檔是如何加載的,為什么插在body開(kāi)頭就行,插在后面就不行。
歡迎選擇我的課程,讓我們一起見(jiàn)證您的進(jìn)步~~
瀏覽器加載頁(yè)面時(shí),碰到 js 代碼會(huì)進(jìn)行加載和解析,這時(shí)候就會(huì)中止其他代碼的解析和渲染。這就是為什么我們一般把 js 代碼放在頁(yè)面尾部的原因,不組織頁(yè)面文檔結(jié)構(gòu)的加載,而且可以對(duì)所有的 DOM 元素進(jìn)行操作。
上面代碼中,在執(zhí)行那一句 js 代碼時(shí),整個(gè)頁(yè)面的 html 結(jié)構(gòu)還沒(méi)有加載完成,所以瀏覽器并不知道 body 的末尾位置,而 body 開(kāi)頭位置已經(jīng)確定了,所以新 p 可以添加到開(kāi)頭而不能添加到結(jié)尾。
DOM文檔加載的步驟
1 解析HTML結(jié)構(gòu)。
2 加載外部腳本和樣式表文件。
3 解析并執(zhí)行腳本代碼。
4 構(gòu)造HTML DOM模型。//DOMContentLoaded
5 加載圖片等外部文件。
6 頁(yè)面加載完畢。//load
理論上是這樣,但實(shí)際還要考慮文檔內(nèi)容的位置,由于是從上到下解析,遇到j(luò)s會(huì)阻塞渲染進(jìn)行js解析和執(zhí)行。
你所說(shuō)的問(wèn)題,我猜測(cè)是因?yàn)閳?zhí)行時(shí)body的前部已經(jīng)渲染,而尾部未渲染導(dǎo)致的,就是不知道往哪插入尾部。
由于現(xiàn)代瀏覽器對(duì)DOM操作的優(yōu)化,我在chrome上已經(jīng)測(cè)試不出錯(cuò)誤,兩種都可以,所以沒(méi)必要太過(guò)在意這個(gè)問(wèn)題了,只要記得順序渲染,js放底部就行。