<head>
<script>
var a = document.getElementById("myLink"); // null!
a.onclick = function() { ... };
</script>
</head>
<body>
<a id="myLink" href="#">Link</a>
</body>
瀏覽器自上而下解析 HTML,<head> 中的腳本執行時,<body> 尚未解析,DOM 樹中不存在目標元素,getElementById 返回 null。
<body>
...
<script> var a = document.getElementById("myLink"); ... </script>
</body>
<script src="app.js" defer></script>
瀏覽器異步下載,HTML 解析完成後按順序執行,DOM 已就緒。
document.addEventListener("DOMContentLoaded", function() {
var a = document.getElementById("myLink");
a.onclick = ...;
});
原生 JS 無需依賴 jQuery $(document).ready()。
| 方案 | 優點 | 缺點 |
|---|---|---|
| body 末尾 | 零依賴,兼容所有瀏覽器 | 阻塞頁面渲染(若腳本大) |
| defer | 異步下載,不阻塞渲染,保證順序 | 僅外部腳本有效 |
| DOMContentLoaded | 靈活,內聯腳本也可用 | 需包裹回調函數 |