|
文檔上說defer中的代碼不立即執(zhí)行,頁面會(huì)繼續(xù)載入,那defer中的代碼具體在什么時(shí)候執(zhí)行呢?在全部Javascript代碼載入之后?頁面載入之后?onload之前還是之后?
答案是:
并不是說在網(wǎng)頁載入時(shí)不執(zhí)行,可以在網(wǎng)頁寫一個(gè)SCRIPT.然后定義它,但是在載入時(shí)它還是執(zhí)行了,
后來在找其它的東東時(shí)發(fā)現(xiàn),因?yàn)樗挥袀€(gè)子, 不知它是如何用,
原來它是在你的網(wǎng)頁已截入完成后,你想動(dòng)態(tài)添加一個(gè)新的<script>時(shí)用的,如果你只是object.innerHTML = "<script" + ">"..."</script" + ">";
那么當(dāng)你調(diào)用你這個(gè)新定義的東東就會(huì)出錯(cuò),說還未定義,當(dāng)你在上面的代碼加入defer時(shí)那么你就能成功調(diào)用它,
在下面的代碼中你可以試下把它去掉, defer>";,那么你就會(huì)發(fā)現(xiàn)問題!
<HTML>
<SCRIPT>
function insertScript(){
var sHTML="<input type=button onclick=" + "go2()" + " value='Click Me'><BR>";
var sScript="<SCRIPT defer>";
sScript = sScript + "function go2(){ alert('Hello from inserted script.') }";
sScript = sScript + "</SCRIPT" + ">";
ScriptDiv.innerHTML = sHTML + sScript;
}
</SCRIPT>
<BODY onload="insertScript();">
<DIV ID="ScriptDiv"></DIV>
</BODY>
</HTML>
//defer屬性指示該段腳本不會(huì)改變文檔的內(nèi)容。在文檔完全顯示之前,js解釋器不執(zhí)行這段代碼。
具體到這個(gè)例子,因?yàn)閖s不允許動(dòng)態(tài)生成js代碼,所以去掉defer后產(chǎn)生的代碼會(huì)被認(rèn)為是非法的。加上defer后的代碼,會(huì)被解釋器認(rèn)為是載入頁面的時(shí)候跳過去的,可以執(zhí)行。
<script src="../js/script.js" defer></script>
中的defer作用是文檔加載完畢了再執(zhí)行腳本,這樣回避免找不到對(duì)象的問題
<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屬性得到的好處就不太大。
JavaScript技術(shù):&amp;lt;script defer&amp;gt; defer 是什么意思,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。