<script>標簽對HTML文件解析過程的影響以及async和defer屬性的應用

在前端開發中,<script> 標簽的 asyncdefer 屬性會顯著影響 JavaScript 腳本的加載和執行時機。下面結合示例代碼,詳細解析它們之間的區別:

1. 默認情況(無 async/defer

<script src="script.js"></script>
特性
  • 阻塞渲染:瀏覽器遇到 <script> 標簽后,會立即暫停 HTML 解析,下載并執行腳本,直到腳本執行完畢才繼續解析 HTML。
  • 執行順序:按照標簽在 HTML 中的出現順序執行。
  • 適用場景:需要立即執行的腳本,或依賴于當前 DOM 的腳本。
示例
<!DOCTYPE html>
<html>
<head><title>默認腳本加載</title>
</head>
<body><div id="app">加載中...</div><!-- 阻塞渲染,直到 script.js 下載并執行完畢 --><script src="script.js"></script><div>其他內容</div>
</body>
</html>

2. async 屬性

<script async src="script.js"></script>
特性
  • 異步下載:腳本的下載與 HTML 解析同時進行,不會阻塞渲染。
  • 立即執行:腳本下載完成后,會立即暫停 HTML 解析并執行腳本。
  • 執行順序不確定:多個 async 腳本的執行順序取決于下載完成的時間,與標簽順序無關。
  • 適用場景:獨立的、不依賴于其他腳本或 DOM 的異步腳本(如廣告、分析工具)。
示例
<!DOCTYPE html>
<html>
<head><title>async 腳本加載</title>
</head>
<body><div id="app">加載中...</div><!-- 不阻塞渲染,下載完成后立即執行 --><script async src="analytics.js"></script><div>其他內容</div>
</body>
</html>

3. defer 屬性

<script defer src="script.js"></script>
特性
  • 異步下載:腳本的下載與 HTML 解析同時進行,不會阻塞渲染。
  • 延遲執行:腳本會在 HTML 解析完成后、DOMContentLoaded 事件觸發前執行。
  • 執行順序確定:多個 defer 腳本按標簽在 HTML 中的出現順序執行。
  • 適用場景:需要操作 DOM 或依賴于其他腳本的庫(如 jQuery)。
示例
<!DOCTYPE html>
<html>
<head><title>defer 腳本加載</title><!-- defer 腳本會在 HTML 解析完成后按順序執行 --><script defer src="jquery.js"></script><script defer src="app.js"></script>
</head>
<body><div id="app">內容</div>
</body>
</html>

ps:

在瀏覽器解析 HTML 的過程中,defer 腳本的執行先于 DOMContentLoaded 事件

執行順序原理

  1. defer 腳本的特性

    • 帶有 defer 屬性的腳本會與 HTML 解析并行下載(不阻塞解析)。
    • 下載完成后不會立即執行,而是等待整個 HTML 文檔解析完成(即 DOM 構建完成)后,再按腳本在 HTML 中的順序依次執行。
  2. DOMContentLoaded 事件的觸發時機

    • 當整個 HTML 文檔解析完成(DOM 樹構建完畢),且所有 defer 腳本執行完成后,才會觸發 DOMContentLoaded 事件。

示例驗證

<!DOCTYPE html>
<html>
<head><!-- defer 腳本:在 HTML 解析完成后執行 --><script defer src="defer-script.js"></script><script>// 監聽 DOMContentLoaded 事件document.addEventListener('DOMContentLoaded', () => {console.log('DOMContentLoaded 事件觸發');});</script>
</head>
<body><h1>測試執行順序</h1>
</body>
</html>
// defer-script.js
console.log('defer 腳本執行');
輸出順序:
defer 腳本執行
DOMContentLoaded 事件觸發

結論

defer 腳本的執行先于 DOMContentLoaded 事件
defer 的設計初衷就是保證腳本在 DOM 就緒后、DOMContentLoaded 之前執行,適合需要操作 DOM 且依賴執行順序的場景(如加載 jQuery 后再執行依賴它的代碼)。

執行時機對比圖

HTML 解析         |---------------------------->|
默認腳本          |    下載并執行    |
async 腳本        |      下載       | 執行 |
defer 腳本        |      下載       |       | 執行
DOMContentLoaded  |---------------------------->|

關鍵區別總結

特性默認(無屬性)asyncdefer
是否阻塞渲染
下載時機HTML 解析暫停與 HTML 解析并行與 HTML 解析并行
執行時機下載后立即執行下載完成后立即執行HTML 解析完成后執行
執行順序按標簽順序不確定(下載完成順序)按標簽順序
DOM 依賴需確保 DOM 已加載不依賴 DOM可依賴 DOM

最佳實踐

  1. 優先使用 defer:對于需要操作 DOM 或依賴于其他腳本的代碼,使用 defer
  2. 使用 async 加載獨立腳本:對于不依賴其他資源的異步腳本(如第三方庫),使用 async
  3. 內聯腳本避免使用 async/deferasyncdefer 僅對外部腳本(src 屬性)有效,對內聯腳本無效。

兼容性

  • asyncdefer 均支持現代瀏覽器及 IE10+。
  • 若需兼容 IE9 及以下版本,需使用默認加載方式或通過 JavaScript 動態加載腳本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91095.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue.js:從 Web 到桌面的跨端實踐與技術選型指南

一、Vue.js 的核心能力邊界 作為漸進式 JavaScript 框架,Vue.js 的核心價值在于構建現代 Web 用戶界面: ? 前端核心場景:單頁應用(SPA)、動態交互界面、可復用組件開發 ? 架構限制:無法直接改造 B/S(瀏覽器/服務器)為 C/S(客戶端/服務器)架構 關鍵差異:B/S 依賴瀏…

SSRF11 各種限制繞過之DNS rebinding 繞過內網 ip 限制

ssrf漏洞在廠商的處理下可能進行一些特殊處理導致我們無法直接利用漏洞 有以下四種&#xff1a; 1.ip地址限制繞過 2.域名限制繞過 3.30x跳轉繞過域名限制 4.DNS rebinding繞過內網ip限制 本章我們講DNS rebinding 繞過內網 ip 限制 DNS rebinding 繞過內網 ip 限制 假…

FreeRTOS之鏈表操作相關接口

FreeRTOS之鏈表操作相關接口1 FreeRTOS源碼下載地址2 任務控制塊TCB2.1 任務控制塊TCB2.1.1 任務控制塊的關鍵成員2.1.2 TCB 的核心作用2.2 ListItem_t2.3 List_t3 函數接口3.1 vListInitialise3.2 vListInitialiseItem1 FreeRTOS源碼下載地址 https://www.freertos.org/ 2 …

項目一第一天

目錄 總結MySQL&#xff1a; 最終還是得按照SQL的語法來實施。 1、MySQL的數據類型&#xff1a;指業務數據按照什么格式存儲在數據庫中的。 任何數據類型最常見的三種&#xff1a;字符串、整型和小數型。 如&#xff1a;寶貝計劃這種存在視頻的項目&#xff0c;你們的視頻是存放…

STM32第二十天 ESP8266-01S和電腦實現串口通信(3)

1&#xff1a;透傳透傳&#xff08;又稱透明傳輸&#xff09;是一種通信模式&#xff0c;其核心特點是&#xff1a;通信設備對傳輸的數據不做任何解析或處理&#xff0c;僅作為“管道”原封不動地轉發數據&#xff0c;仿佛數據“透明”地穿過設備。透傳的本質關鍵特征說明無協議…

微服務引擎 MSE 及云原生 API 網關 2025 年 3 月產品動態

點擊此處&#xff0c;了解微服務引擎 MSE 產品詳情。

在 Docker 上安裝和配置 Kafka、選擇用于部署 Kafka 的操作系統

消息代理是一種軟件&#xff0c;充當在不同應用程序之間發送消息的中介。它的功能類似于服務器&#xff0c;從一個應用程序&#xff08;稱為生產者&#xff09;接收消息&#xff0c;并將其路由到一個或多個其他應用程序&#xff08;稱為消費者&#xff09;。消息代理的主要目的…

2D下的幾何變換(C#實現,持續更新)

&#xff08;1&#xff09;已知2D下&#xff0c;新坐標系的原點、X軸方向向量、Y軸方向向量在原始坐標系下的表示&#xff0c;求原始坐標系中直線&#xff0c;在新坐標系下的直線方程&#xff1b;&#xff08;2&#xff09;求直線與2D包圍盒的交點&#xff0c;可能有0、1或2個交…

Pandas-特征工程詳解

Pandas-特征工程詳解一、特征工程的核心目標二、數據類型與基礎轉換1. 數值型特征&#xff1a;類型優化與異常處理2. 分類型特征&#xff1a;編碼與規范化&#xff08;1&#xff09;標簽編碼&#xff08;Label Encoding&#xff09;&#xff08;2&#xff09;獨熱編碼&#xff…

pip install torch各種版本的命令及地址

一、遇到的問題&#xff1a;cuda和torch編譯時的版本不一致 在安裝mmcv時遇到error MMCV_WITH_OPS1 python setup.py develo RuntimeError: The detected CUDA version (11.3) mismatches the version that was used to compile PyTorch (10.2). Please make sure to use th…

【spring boot】三種日志系統對比:ELK、Loki+Grafana、Docker API

文章目錄**方案 1&#xff1a;使用 ELK&#xff08;Elasticsearch Logstash Kibana&#xff09;****適用場景****搭建步驟****1. 修改 Spring Boot 日志輸出****2. 創建 Docker Compose 文件****3. 配置 Logstash****4. 啟動服務****方案 2&#xff1a;使用 Loki Grafana***…

Cesium加載3DTiles模型并且重新設置3DTiles模型的高度

代碼&#xff1a; 使用的時候&#xff0c;直接調用 load3DTiles() 方法既可。 // 加載3Dtiles const load3DTiles async () > {let tiles_url "/3DTiles2/Production_1.json";let tileset await Cesium.Cesium3DTileset.fromUrl(tiles_url, {enableCollision: …

Matlab批量轉換1km降水數據為tiff格式

1km降水數據處理- 制作數據裁剪掩膜 0 引言1 示例程序2 結語0 引言 本篇介紹用Matlab工具將中國1km分辨率逐月降水量數據集(1901-2024)批量轉為tiff格式的過程。下面為具體內容: 1 示例程序 下載得到的nc數據(如pre_2001.nc)包含4個字段,其中降水數據的第1個維度為1-12,…

HandyJSON使用詳情

注意事項:Model 需要實現 HandyJSON 協議&#xff0c;對于簡單情況&#xff0c;只需聲明 class/struct 并添加 HandyJSON 協議即可1.簡單 JSON 結構JSON 數據:{"name": "John","age": 30,"isStudent": false }Model 類:struct Person:…

comfyUI-IPApterfaceID人臉特征提取

1.基礎節點 以Checkpoint、CLIP、空Latent、K采樣器、VAE解碼、預覽圖像為基礎節點。 2.人臉特征獲取節點 IPAdapter FaceID節點專用于將特定人臉特征&#xff08;通過參考圖提取&#xff09;融入生成圖像。 參考圖像&#xff0c;正面圖像是想要參考人物的人像&#xff0c;最…

【React Native】Switch、Alert、Dimensions、StatusBar、Image組件

其他常用組件 swich https://reactnative.dev/docs/next/switch alert Alert React Native 如果想增加里面的按鈕&#xff0c;就往這個數組里&#xff0c;按照這個格式不斷的加東西就行了。但是&#xff1a; 在iOS上&#xff0c;里面多少個都有問題&#xff0c;3 個以上它…

滲透筆記1-4

一、HTTPS安全機制 1. HTTP的安全風險 竊聽風險&#xff1a;明文傳輸導致通信內容可被直接截獲&#xff08;如Wireshark抓包獲取密碼&#xff09;。篡改風險&#xff1a;中間人可修改傳輸內容&#xff08;如注入惡意腳本&#xff09;。冒充風險&#xff1a;攻擊者偽造服務端身份…

《星盤接口6:星際聯盟》

《星盤接口6&#xff1a;星際聯盟》? 第一章&#xff1a;新的黎明地球歷2097年&#xff0c;陳欣和她的團隊成功地將“數據之神”封印在一個獨立的數據維度中&#xff0c;暫時解除了對銀河系的威脅。然而&#xff0c;這場勝利并沒有帶來長久的和平。隨著人類文明不斷擴展至更遙…

【安卓筆記】進程和線程的基礎知識

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 先熟悉JVM虛擬機的線程 ----------以下都是系統線程&#xff0c;由JV…

26-計組-多處理器

多處理器的基本概念1. 計算機體系結構分類依據&#xff1a;根據指令流和數據流的數量關系&#xff0c;計算機體系結構可分為四種類型&#xff1a;SISD、SIMD、MISD、MIMD。&#xff08;1&#xff09;SISD 單指令流單數據流定義&#xff1a;任意時刻計算機只能執行單一指令操作單…