雖然沒準備什麼資料
  • JS魔法學院
    • JS表單
    • 教程
    • 練習題
  • AI
  • 程式相關
    • CSS
    • Javascript
  • 試題與解答
    • 微生物免疫
    • 化學
    • 生物輸送
  • 台式外語
    • 韓國語
    • 日本語
  • 有趣網站
首頁 » 為什麼<script>寫在<head>時建議要加上defer ?
JS魔法學院教程

為什麼<script>寫在<head>時建議要加上defer ?

by Jamic 2025-03-06
563

在 HTML 中,當 <script> 標籤放在 <head> 時,建議加上 defer 屬性的原因與網頁的載入和執行順序有關。讓我詳細解釋一下:

問題背景

通常,當瀏覽器解析 HTML 文件時,它是從上到下逐步處理的。如果在 <head> 中放入 <script> 標籤,且該腳本是外部檔案(例如 <script src=”example.js”></script>),瀏覽器會在遇到這個標籤時立即停止解析 HTML,去下載並執行該腳本。這會導致一個問題:如果腳本需要操作頁面中的 DOM 元素(例如 <div> 或 <button>),而這些元素位於 <body> 中尚未被解析,腳本執行時就會找不到這些元素,進而引發錯誤或無法正常運作。

此外,這種行為還會延遲頁面的渲染,因為瀏覽器必須等待腳本下載和執行完畢後,才能繼續處理後續的 HTML 內容。這對用戶體驗來說是不利的,尤其是在腳本檔案較大或網路速度較慢的情況下。

defer 的作用

defer 屬性告訴瀏覽器,在遇到 <script> 標籤時,可以繼續解析 HTML,不必等待腳本的下載和執行。具體來說:

  1. 非阻塞載入:瀏覽器會在背景中下載腳本檔案,同時繼續解析 HTML 和構建 DOM。
  2. 延遲執行:腳本只會在整個 HTML 文件解析完成(即 DOM 構建完成)後才執行。
  3. 順序保證:如果有多個帶有 defer 的 <script>,它們會按照在 HTML 中出現的順序依次執行。

因此,當 <script> 放在 <head> 並加上 defer 時,你可以確保:

腳本執行時,DOM 已完全可用,避免找不到元素的情況。

頁面不會因為腳本載入而延遲渲染。

範例

沒有 defer 的情況

<head>
  <script src="example.js"></script>
</head>
<body>
  <div id="myDiv">Hello</div>
</body>

假設 example.js 包含:

console.log(document.getElementById("myDiv"));

結果會是 null,因為腳本在 <body> 中的 <div> 被解析前就執行了。

加上 defer 的情況

<head>
  <script src="example.js" defer></script>
</head>
<body>
  <div id="myDiv">Hello</div>
</body>

這次,腳本會等到 HTML 解析完成後才執行,document.getElementById(“myDiv”) 會正確返回 <div> 元素。

什麼時候需要 defer?

  • 當 <script> 放在 <head> 中,且腳本需要操作 DOM 時。
  • 當你希望腳本按順序執行,但不想阻塞頁面載入時。

替代方案

如果你不使用 defer,另一個常見做法是將 <script> 放在 </body> 結束標籤之前。這樣,腳本會在 DOM 解析完成後自然執行,不需要額外屬性。但若腳本必須出現在 <head>(例如某些第三方腳本或初始化需求),defer 是更好的選擇。

總結

在 <head> 中的 <script> 加上 defer,是為了避免阻塞 HTML 解析,確保腳本在 DOM 準備好後執行,並提升頁面載入效能。這是一個現代網頁開發的最佳實踐,特別是在處理外部腳本時。


探索更多來自 雖然沒準備什麼資料 的內容

訂閱即可透過電子郵件收到最新文章。

javascript
分享 0 FacebookTwitterLINEEmail

留個言 取消回覆

將姓名、email存到這個瀏覽器,以便下次使用

使用電子郵件訂閱網站

輸入你的電子郵件地址訂閱網站的新文章,使用電子郵件接收新通知。

最新文章

  • Product Brief Template — AI 建構式應用產品

    2025-07-10
  • 日本語能力試驗 JLPT N3 – 文法

    2025-04-13
  • Poisson distribution 醫用統計學 (1) – 卜瓦松分布

    2025-03-28
  • 2025 竹北新生兒手續及補助一次辦完懶人包

    2025-03-17
  • 為什麼<script>寫在<head>時建議要加上defer ?

    2025-03-06

文章分類

  • JS魔法學院 (7)
    • JS表單 (1)
    • 教程 (4)
    • 練習題 (2)
  • soledad佈景主題 (1)
    • 單篇文章 (1)
  • Vue3學院 (2)
    • watch (1)
    • 設定 (1)
  • Wordpress外掛介紹 (1)
  • 台式外語 (5)
    • 日本語 (3)
    • 英語 (1)
    • 韓國語 (1)
  • 好書介紹 (3)
  • 小孩相關 (1)
  • 投資理財 (11)
    • 定存 (2)
    • 股票 (9)
      • 台股 (1)
      • 美股 (3)
  • 有趣網站 (1)
  • 未分類 (1)
  • 程式相關 (10)
    • AI (5)
    • CSS (1)
    • google sheets (1)
    • Javascript (1)
    • 豆知識 (2)
  • 試題與解答 (12)
    • 儀器分析 (1)
    • 專利研究 (2)
    • 微生物免疫 (8)
    • 醫用統計學 (1)

網站統計

  • 0
  • 0
  • 0
  • 70
  • 5,195
  • 3,325
  • 55
  • 2025-07-10

© 2023 雖然沒準備什麼資料

雖然沒準備什麼資料
  • JS魔法學院
    • JS表單
    • 教程
    • 練習題
  • AI
  • 程式相關
    • CSS
    • Javascript
  • 試題與解答
    • 微生物免疫
    • 化學
    • 生物輸送
  • 台式外語
    • 韓國語
    • 日本語
  • 有趣網站