javascript中defer的作用

來源:互聯網
上載者:User

javascript中defer的作用

 這篇文章主要是對javascript中defer的作用進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所協助

很多人都已經把 Javascript的用的爐火純青了,但見到defer未必就知道他是做什麼用的;很多人也都遇到過這樣的問題,需要直接執行別且操作DOM對象的js 總是報找不到對象的錯誤,原因大家也都知道就是頁面還有沒有載入完畢,js的操作對象還在下載中。但很多人都不知道,添加defer標籤就能輕而易舉解決這個問題。

 

<script src="../CGI-bin/delscript.js" defer></script>

 

中的defer作用是文檔載入完畢了再執行指令碼,這樣迴避免找不到對象的問題---有點問題

 

代碼如下:

<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 等於在頁面完全在入後再執行,相當於 window.onload ,但應用上比 window.onload 更靈活!

 

defer是指令碼程式強大功能中的一個“無名英雄”。它告訴瀏覽器Script段包含了無需立即執行的代碼,並且,與SRC屬性聯合使用,它還可以使這些指令碼在後台被下載,前台的內容則正常顯示給使用者。

 

--但是 文檔載入完畢了再執行指令碼

 

請注意兩點:

 

1、不要在defer型的指令碼程式段中調用document.write命令,因為document.write將產生直接輸出效果。

 

2、而且,不要在defer型指令碼程式段中包括任何立即執行指令碼要使用的全域變數或者函數。 

 

一個常用的最佳化效能的方法是:當指令碼不需要立即運行時,在<SCRIPT>標籤中設定“defer”屬性。 (立即指令碼沒有被包含在一個function塊中,因此會在載入過程中執行。) 設定“defer”屬性後,IE就不必等待該指令碼裝載和執行完畢。這樣頁面載入會更快。一般來說,這也表明立即指令碼最好放在function塊中,並在 document或者body對象的onload 控制代碼中處理該函數。在有一些指令碼需要依賴使用者操作而執行時----例如點擊按鈕,或者移動滑鼠到某個地區----使用該屬性非常有用。但當有一些指令碼需要在頁面載入過程中或載入完成後執行,使用defer屬性得到的好處就不太大。

 

script中的defer屬性預設情況下是false的。按照DHTML編程寶典中的描述,對於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.

 

也就是說:如果是編寫指令碼的時候加入defer屬性,那麼瀏覽器在下載指令碼的時候就不必立即對其進行處理,而是繼續對頁面進行下載和解析,這樣會提高下載的效能。

 

這樣的情況有很多種。比如你定義了很多javascript變數,或者在引用檔案(.inc)中寫了很多的指令碼需要處理,那不妨在這些指令碼中加入defer屬性,對效能的提高肯定有所協助。

 

舉例如下: 

 

代碼如下:

<script language="javascript" defer>

var object = new Object();

....

</script>

 

因為defer屬性預設是為false的,那麼在這裡

 

<script language="javascript" defer>

 

顯式聲明defer屬性後等同於

 

<script language="javascript" defer=true>

 

聲明了defer屬性之後,需要判斷是否有別的變數引用了defer指令碼塊中的變數,否則的話會導致指令碼錯誤的產生。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.