javascript高階程式設計講到IE中的錯誤時提到操作中止(operation shorted)這個概念:
在修改尚未載入完成的頁面會發生錯誤。
範例程式碼為:
<body>
<p></p>
<p>
<script>
document.body.appendChild(document.createElement("p"));
</script>
</p>
</body>
當<script>被包含在某個元素中,且JS程式碼要使用DOM方法修改其父元素或祖先元素,會發生操作中止錯誤(因為只能修改已經載入完的元素)。
而改為
document.body.insertChild(document.createElement("p"),document.body.firstChild);
就能避免錯誤。
說是新<p>加入document.body開頭而不是結尾,就沒有錯誤。
看了完就不太懂文件是如何載入的,為什麼插在body開頭就行,插在後面就不行。
瀏覽器載入頁面時,碰到 js 程式碼會進行載入和解析,這時候就會中止其他程式碼的解析和渲染。這就是為什麼我們一般把 js 程式碼放在頁面尾部的原因,不組織頁面文件結構的加載,而且可以對所有的 DOM 元素進行操作。
上面程式碼中,在執行那一句js 程式碼時,整個頁面的html 結構還沒有載入完成,所以瀏覽器並不知道body 的結尾位置,而body 開頭位置已經確定了,所以新p 可以加入到開頭而不能添加到結尾。
DOM文件載入的步驟
1 解析HTML結構。
2 載入外部腳本和樣式表檔案。
3 解析並執行腳本程式碼。
4 構造HTML DOM模型。 //DOMContentLoaded
5 載入圖片等外部檔案。
6 頁面載入完畢。 //load
理論上是這樣,但實際上還要考慮文件內容的位置,由於是從上到下解析,遇到js會阻塞渲染進行js解析和執行。
你所說的問題,我猜測是因為執行時body的前部已經渲染,而尾部未渲染導致的,就是不知道往哪插入尾部。
由於現代瀏覽器對DOM操作的優化,我在chrome上已經測試不出錯誤,兩種都可以,所以沒必要太過在意這個問題了,只要記得順序渲染,js放底部就行。