這篇文章主要是對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腳本塊中的變量,否則的話會導致腳本錯誤的產生。