【筆記】JS腳本為什麼要放在body最後面以及async和defer的異同點

来源:https://www.cnblogs.com/souldee/archive/2018/07/20/9343493.html
-Advertisement-
Play Games

1.沒有 或`async` 瀏覽器遇到腳本的時候會暫停渲染並立即載入執行腳本(外部腳本),“立即”指的是在渲染該 script 標簽之下的文檔元素之前,也就是說不等待後續載入的文檔元素,讀到就載入並執行。因此如果將JS腳本放置在head的話會產生 ,並且腳本當中對於DOM的操作也會出現報錯,因為還沒 ...


1.沒有deferasync

瀏覽器遇到腳本的時候會暫停渲染並立即載入執行腳本(外部腳本),“立即”指的是在渲染該 script 標簽之下的文檔元素之前,也就是說不等待後續載入的文檔元素,讀到就載入並執行。因此如果將JS腳本放置在head的話會產生阻塞,並且腳本當中對於DOM的操作也會出現報錯,因為還沒有生成。

放在body底部的JS腳本的執行順序是按照在文檔中的先後順序執行的,而不是按照下載下的順序

2.有async過程如下:

1.瀏覽器開始解析網頁

2.解析過程中,發現帶有async屬性的script標簽

3.瀏覽器繼續往下解析 HTML 網頁,同時並行下載外部腳本

4.腳本下載完成,瀏覽器暫停解析網頁,開始執行下載的腳本

5.腳本執行完畢,瀏覽器恢復解析網頁

async腳本執行順序是下載的順序

3.有defer過程如下:

1.瀏覽器開始解析網頁

2.解析過程中,發現帶有defer屬性的腳本元素

3.瀏覽器繼續往下解析網頁,同時並行下載腳本元素載入的外部腳本

4.瀏覽器完成解析網頁,此時再回過頭執行已經下載完成的腳本

defer腳本執行順序是出現的先後順序

4.defer還是async

兩者之間的選擇則是看腳本之間是否有依賴關係,有依賴的話應當要保證執行順序,應當使用defer沒有依賴的話使用async,同時使用的話defer失效。要註意的是兩者都不應該使用document.write,這個導致整個頁面被清除。

瀏覽器完整過程是先解析渲染HTML,當遇到腳本文件的時候則執行腳本文件,等待腳本文件執行完畢才繼續解析html,因此會產生阻塞頁面的情況,因此最好將腳本放在body底部,當瀏覽器遇到標有defer的時候則會下載該腳本,同是繼續解析html,然後等到dom解析完畢之後才解析defer腳本,而如果遇到async腳本的時候同樣是下載該腳本同是繼續解析html,當anync下載完畢之後,而html尚未解析完畢,也會先解析async腳本,等待async腳本解析完畢之後才繼續解析html。

詳細的過程對比參考下圖:

參考

阮一峰JS教程

JavaScript高級程式

document.write的用處


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在模塊的build.gradle裡面添加了 Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support:design:26.1.0.Open FileSho ...
  • 用git 遠程獲取指定分支的代碼 ...
  • 作為開發,有一個自己的飯碗還是有必要的。因為交接舊電腦的時候,你會遇到了一些問題,而自己的電腦就方便很多了。 要開發,當然要裝一些與開發相關的東西,那麼新電腦入手,要做些什麼呢? 1.安裝Xcode;(代碼可以不會寫,這個不能不會裝) 2.安裝CocoaPods,點我; 4.代碼管理工具SVN or ...
  • iOS標識符 現今來比較下,不同情況下兩種標識符的變化情況。以下試驗,每種標識符均分為存於Keychain和未存於Keychain的兩種情況做比較。 廣告標識符(IDFA-identifierForIdentifier),是AdSupport.framework裡面的。可以通過ASIdentifie ...
  • 使用jquery的ajax方法向伺服器發送請求的時候,常常需要使用到error函數進行錯誤信息的處理,本文詳細說明瞭ajax中error函數和函數中各個參數的用法。 一般error函數返回的參數有三個:function(jqXHR jqXHR, String textStatus, String e ...
  • 一、精靈圖使用場景: 二、Css Sprite(優點) 減少圖片的位元組。 減少網頁的http請求,從而大大的提高頁面的性能。 解決了網頁設計師在圖片命名上的困擾,只需對一張集合的圖片上命名就可以了,不需要對每一個小元素進行命名,從而提高了網頁的製作效率。 更換風格方便,只需要在一張或少張圖片上修改圖 ...
  • 轉載請註明出處: https://home.cnblogs.com/u/zhiyong-ITNote/ 修改一個已有的項目,主要是前端方面,一般的項目後端都是處理好了的,不需要改也不能改,除非特殊需求。然後就遇到了牛逼的代碼。本來看別人已有的代碼做開發就是一件很頭疼的事,一個函數一個方法一個屬性的找 ...
  • //半徑 var r = 130; //重置原點 ctx.save(); ctx.translate(400, 500); //使用translate重置原點 function drawClock() { //畫時鐘不動的背景 //時鐘外圈 ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...