深入理解javascript中defer的作用
很多人都已經(jīng)把 Javascript的用的爐火純青了,但見到defer未必就知道他是做什么用的;很多人也都遇到過這樣的問題,需要直接執(zhí)行別且操作DOM對(duì)象的js 總是報(bào)找不到對(duì)象的錯(cuò)誤,原因大家也都知道就是頁面還有沒有加載完畢,js的操作對(duì)象還在下載中。但很多人都不知道,添加defer標(biāo)簽就能輕而易舉的解決這個(gè)問題。
<script src="../CGI-bin/delscript.js" defer></script>
中的defer作用是文檔加載完畢了再執(zhí)行腳本,這樣回避免找不到對(duì)象的問題---有點(diǎn)問題
<button id="myButton" onclick="alert('ok')">test</button>
<script>
myButton.click();
</script>
<script>
myButton.click();
</script>
<button id="myButton" onclick="alert('ok')">test</button>
<script defer>
function document.body.onload() {
alert(document.body.offsetHeight);
}
</script>
加上 defer 等于在頁面完全在入后再執(zhí)行,相當(dāng)于 window.onload ,但應(yīng)用上比 window.onload 更靈活!
defer是腳本程序強(qiáng)大功能中的一個(gè)“無名英雄”。它告訴瀏覽器Script段包含了無需立即執(zhí)行的代碼,并且,與SRC屬性聯(lián)合使用,它還可以使這些腳本在后臺(tái)被下載,前臺(tái)的內(nèi)容則正常顯示給用戶。
--但是 文檔加載完畢了再執(zhí)行腳本
請(qǐng)注意兩點(diǎn):
1、不要在defer型的腳本程序段中調(diào)用document.write命令,因?yàn)閐ocument.write將產(chǎn)生直接輸出效果。
2、而且,不要在defer型腳本程序段中包括任何立即執(zhí)行腳本要使用的全局變量或者函數(shù)。
一個(gè)常用的優(yōu)化性能的方法是:當(dāng)腳本不需要立即運(yùn)行時(shí),在<SCRIPT>標(biāo)簽中設(shè)置“defer”屬性。 (立即腳本沒有被包含在一個(gè)function塊中,因此會(huì)在加載過程中執(zhí)行。) 設(shè)置“defer”屬性后,IE就不必等待該腳本裝載和執(zhí)行完畢。這樣頁面加載會(huì)更快。一般來說,這也表明立即腳本最好放在function塊中,并在 document或者body對(duì)象的onload 句柄中處理該函數(shù)。在有一些腳本需要依賴用戶操作而執(zhí)行時(shí)----例如點(diǎn)擊按鈕,或者移動(dòng)鼠標(biāo)到某個(gè)區(qū)域----使用該屬性非常有用。但當(dāng)有一些腳本需要在頁面加載過程中或加載完成后執(zhí)行,使用defer屬性得到的好處就不太大。
script中的defer屬性默認(rèn)情況下是false的。按照DHTML編程寶典中的描述,對(duì)于Defer屬性是這樣寫的:
Using the attribute at design time can improve the download performance of a page because the browser does not need to parse and execute the script and can continue downloading and parsing the page instead.
也就是說:如果是編寫腳本的時(shí)候加入defer屬性,那么瀏覽器在下載腳本的時(shí)候就不必立即對(duì)其進(jìn)行處理,而是繼續(xù)對(duì)頁面進(jìn)行下載和解析,這樣會(huì)提高下載的性能。
這樣的情況有很多種。比如你定義了很多javascript變量,或者在引用文件(.inc)中寫了很多的腳本需要處理,那不妨在這些腳本中加入defer屬性,對(duì)性能的提高肯定有所幫助。
舉例如下:
<script language="javascript" defer>
var object = new Object();
....
</script>
因?yàn)閐efer屬性默認(rèn)是為false的,那么在這里
<script language="javascript" defer>
顯式聲明defer屬性后等同于
<script language="javascript" defer=true>
聲明了defer屬性之后,需要判斷是否有別的變量引用了defer腳本塊中的變量,否則的話會(huì)導(dǎo)致腳本錯(cuò)誤的產(chǎn)生。
相關(guān)文章
JS中數(shù)組常用的循環(huán)遍歷你會(huì)幾種
JS 遍歷數(shù)組(循環(huán)數(shù)組)的方式有多種,但你都知道嗎?下面這篇文章主要給大家介紹了關(guān)于JS中數(shù)組常用循環(huán)遍歷的相關(guān)資料,需要的朋友可以參考下2021-06-06JavaScript之瀏覽器對(duì)象_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
JavaScript可以獲取瀏覽器提供的很多對(duì)象,并進(jìn)行操作。下面通過本文給大家介紹JavaScript之瀏覽器對(duì)象的相關(guān)知識(shí),一起看看吧2017-07-07對(duì)layer彈出框中icon數(shù)字參數(shù)的說明介紹
今天小編就為大家分享一篇對(duì)layer彈出框中icon數(shù)字參數(shù)的說明介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09為非IE瀏覽器添加mouseenter,mouseleave事件的實(shí)現(xiàn)代碼
為非IE瀏覽器添加mouseenter,mouseleave事件的實(shí)現(xiàn)代碼,學(xué)習(xí)js的朋友可以參考下。2011-06-06Javascript獲取與設(shè)置ckeditor數(shù)據(jù)的實(shí)現(xiàn)方法
最近編輯器后臺(tái)升級(jí)成了ckeditor,但原來后臺(tái)有很多對(duì)應(yīng)編輯器內(nèi)容的替換功能,那么就需要用js獲取ckeditor編輯器里面的內(nèi)容,這里就為大家介紹一下具體的實(shí)現(xiàn)方法2023-08-08js實(shí)現(xiàn)倒計(jì)時(shí)秒殺效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)倒計(jì)時(shí)秒殺效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12js如何使用Pagination+PageHelper實(shí)現(xiàn)分頁
本文主要介紹了js如何使用Pagination+PageHelper實(shí)現(xiàn)分頁,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06