在學習 HTML 解析機制時,常見的一個疑問是:瀏覽器是從頭到尾讀取 HTML 文件,若在 <head> 中引入的 JavaScript 腳本試圖操作尚未讀取到的 <body> 元素,便會拋出錯誤。但為何 CSS 樣式表先載入、作用於尚未解析的 body 元素時,卻不會報錯?
這涉及瀏覽器渲染引擎的核心流程:
<script> 標籤時(無 defer/async 屬性),會立即暫停 HTML 解析,執行 JS 代碼。若代碼中包含 document.getElementById('foo') 等操作,而對應元素尚未被解析進 DOM,則會返回 null,導致後續調用屬性/方法拋出錯誤。<script> 標籤放在 </body> 之前,確保 DOM 就緒。<head> 中使用 <script defer> 屬性,延遲執行至 HTML 解析完成後。<head> 中,利用瀏覽器並行下載優化首屏渲染。理解這一機制差異,有助於避免常見的「找不到元素」錯誤,並編寫更健壯的前端代碼。