JavaScript腳本延遲加載有哪些方式
1.defer屬性
defer 屬性是用于延遲腳本的執(zhí)行,它可以用于 <script> 標(biāo)簽中。使用 defer 屬性加載的腳本會(huì)在 HTML 解析完畢后,DOMContentLoaded 事件觸發(fā)之前執(zhí)行,即在文檔完全解析后才會(huì)執(zhí)行腳本。
<script src="script.js" defer></script>
在上面的例子中,script.js 腳本會(huì)被延遲加載,并且會(huì)在 HTML 解析完成后立即開(kāi)始下載,但直到文檔解析完成后才會(huì)執(zhí)行,即在 DOMContentLoaded 事件之前執(zhí)行。
使用 defer 屬性的好處是,它不會(huì)阻塞文檔的解析和渲染,同時(shí)保證了腳本在合適的時(shí)機(jī)執(zhí)行。這對(duì)于需要確保腳本在 DOM 樹(shù)完全構(gòu)建之后執(zhí)行的情況非常有用,例如對(duì)于需要操作 DOM 元素的腳本。
補(bǔ)充:
在這里,"文檔"指的是指HTML文檔,即網(wǎng)頁(yè)的HTML結(jié)構(gòu)。在瀏覽器中加載網(wǎng)頁(yè)時(shí),瀏覽器會(huì)按照HTML文檔中的結(jié)構(gòu)解析網(wǎng)頁(yè)內(nèi)容,構(gòu)建DOM(文檔對(duì)象模型)樹(shù),然后再進(jìn)行渲染顯示給用戶。這個(gè)過(guò)程中,HTML文檔的解析和構(gòu)建DOM樹(shù)稱為"文檔解析"。所以,當(dāng)我們說(shuō)文檔解析完成時(shí),意味著HTML文檔已經(jīng)被完全解析,DOM樹(shù)已經(jīng)構(gòu)建完成,網(wǎng)頁(yè)的基本結(jié)構(gòu)已經(jīng)建立好了,可以開(kāi)始執(zhí)行后續(xù)的JavaScript腳本了。
2.async屬性
async 屬性也是用于 <script> 標(biāo)簽的屬性之一,用于異步加載腳本。與 defer 屬性不同,使用 async 屬性加載的腳本在下載完成后會(huì)立即執(zhí)行,不會(huì)等待文檔的解析。
<script src="script.js" async></script>
在上面的例子中,script.js 腳本會(huì)被異步加載,并且在加載完成后立即執(zhí)行,不會(huì)等待文檔的解析。這意味著腳本的執(zhí)行可能會(huì)在 DOM 樹(shù)構(gòu)建完成之前開(kāi)始,因此在使用 async 屬性時(shí)要注意可能出現(xiàn)的執(zhí)行順序問(wèn)題。
使用 async 屬性的主要優(yōu)點(diǎn)是可以并行加載多個(gè)腳本,從而提高頁(yè)面加載速度。但需要注意的是,由于腳本的執(zhí)行時(shí)間不確定,可能會(huì)影響到頁(yè)面的渲染和其他操作。因此,適合使用 async 屬性的腳本通常是獨(dú)立的、不依賴于文檔解析順序的腳本。
3.動(dòng)態(tài)創(chuàng)建DOM方式
要通過(guò)動(dòng)態(tài)創(chuàng)建 DOM 的方式來(lái)實(shí)現(xiàn)對(duì) JavaScript 腳本的延遲加載,可以使用 JavaScript 動(dòng)態(tài)創(chuàng)建 <script> 元素,并設(shè)置其屬性來(lái)實(shí)現(xiàn)延遲加載效果。具體步驟如下:
- 創(chuàng)建一個(gè) <script> 元素。
- 設(shè)置該 <script> 元素的 src 屬性為要延遲加載的 JavaScript 文件的 URL。
- 如果需要,可以設(shè)置其他屬性,如 defer 或 async。
- 將該 <script> 元素插入到文檔中,通常是插入到 <head> 或 <body> 元素中。
下面是一個(gè)示例代碼:
// 創(chuàng)建一個(gè) <script> 元素 var scriptElement = document.createElement('script'); // 設(shè)置要延遲加載的 JavaScript 文件的 URL scriptElement.src = 'script.js'; // 設(shè)置屬性以實(shí)現(xiàn)延遲加載,比如使用 defer 或 async scriptElement.defer = true; // 或者使用 scriptElement.async = true; // 將 <script> 元素插入到文檔中 document.head.appendChild(scriptElement); // 或者插入到 document.body
通過(guò)上述步驟,可以實(shí)現(xiàn)對(duì) JavaScript 腳本的延遲加載,腳本會(huì)在文檔解析完成后才開(kāi)始下載,并且在 DOMContentLoaded 事件觸發(fā)之前執(zhí)行,從而避免阻塞頁(yè)面的渲染和交互。
4.使用setTime延遲方法
使用 setTimeout 方法來(lái)對(duì) JavaScript 腳本進(jìn)行延遲加載是一種簡(jiǎn)單直接的方式。通過(guò) setTimeout 方法,可以在指定的時(shí)間間隔之后執(zhí)行一段 JavaScript 代碼,從而實(shí)現(xiàn)延遲加載效果。
下面是使用 setTimeout 方法來(lái)延遲加載 JavaScript 腳本的示例代碼:
// 使用 setTimeout 方法延遲加載 JavaScript 腳本 setTimeout(function() { // 創(chuàng)建一個(gè) <script> 元素 var scriptElement = document.createElement('script'); // 設(shè)置要延遲加載的 JavaScript 文件的 URL scriptElement.src = 'script.js'; // 將 <script> 元素插入到文檔中 document.head.appendChild(scriptElement); // 或者插入到 document.body }, 2000); // 2000 毫秒即 2 秒后加載
在上述代碼中,setTimeout 方法接受兩個(gè)參數(shù):第一個(gè)參數(shù)是一個(gè)函數(shù),用來(lái)定義要執(zhí)行的 JavaScript 代碼;第二個(gè)參數(shù)是延遲的時(shí)間,以毫秒為單位。在示例中,設(shè)置了一個(gè)延遲時(shí)間為 2000 毫秒(即 2 秒),在這之后會(huì)執(zhí)行匿名函數(shù)內(nèi)的代碼,其中包括創(chuàng)建 <script> 元素并插入到文檔中,實(shí)現(xiàn)了對(duì) JavaScript 腳本的延遲加載。
5.讓JS最后加載
將JS腳本放在文檔底部,來(lái)使JS腳本盡可能的在最后來(lái)加載執(zhí)行
到此這篇關(guān)于JavaScript腳本延遲加載有哪些方式的文章就介紹到這了,更多相關(guān)JavaScript腳本延遲加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)輪播圖的兩種方式(構(gòu)造函數(shù)、面向?qū)ο?
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)輪播圖的兩種方式,一是構(gòu)造函數(shù)、另一種是面向?qū)ο蠓绞椒绞?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09詳解javascript腳本何時(shí)會(huì)被執(zhí)行
這篇文章主要介紹了詳解javascript腳本何時(shí)會(huì)被執(zhí)行,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下2021-02-02JS實(shí)現(xiàn)移動(dòng)端判斷上拉和下滑功能
通過(guò)手指觸屏,利用touchstart和touchend計(jì)算前后滑動(dòng)距離,判斷是上拉還是下滑。接下來(lái)通過(guò)實(shí)例代碼給大家介紹js移動(dòng)端判斷上拉和下滑功能,感興趣的朋友一起看看吧2017-08-08詳解用js代碼觸發(fā)dom事件的實(shí)現(xiàn)方案
這篇文章主要介紹了詳解用js代碼觸發(fā)dom事件的實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06微信小程序?qū)崿F(xiàn)倒計(jì)時(shí)調(diào)用相機(jī)自動(dòng)拍照功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)倒計(jì)時(shí)調(diào)用相機(jī)自動(dòng)拍照功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06JavaScript使用ul中l(wèi)i標(biāo)簽實(shí)現(xiàn)刪除效果
這篇文章主要為大家詳細(xì)介紹了JavaScript使用ul中l(wèi)i標(biāo)簽實(shí)現(xiàn)刪除效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04