<script src="../cgi-bin/delscript.js" defer></script>
中的defer作用是文檔載入完畢了再執行指令碼,這樣迴避免找不到對象的問題
加上 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>
- function init(){
- document.getElementById("div").innerHTML="OK";
- }
- init();
- </script>
- <div id="div">如果你能看到這一句,那就是說沒有達到我所要的效果
- <img src="http://icon.ajiang.net/icon_0.gif" />
- </div>
在IE6和FIREFOX2下完全不一樣
IE6中最後執行結果是OK,而firefox中是“如果你能看到這一句,那就是說沒有達到我所要的效果”
我覺得defer這個東西 有延遲執行的意思,IE6裡面先解析完所有html代碼再執行defer中的指令碼
firefox中 先執行指令碼後解析html
不知道這樣的理解是否有誤?
defer的含義並不是這樣的。
在w3c標準中defer的本意只是表示這段指令碼不會輸出文檔內容,所以可以繼續解析和呈現。至於執行順序,完全語焉不詳。而且這個屬性只是一個hint,沒有說必須如此,所以許多瀏覽器根本不睬這個屬性。
但是在defer屬性的創造者ms那裡,是有execute順序的,關於defer的稀奇古怪的行為請看:http://www.websiteoptimization.com/speed/tweak/defer/
正在制定的html5有極大可能會完善script標籤的定義。
會有兩個屬性,async和defer。
其中defer將明確為在整個page的parsing結束之後執行(執行時機差不多就是DOMContentLoad或者IE htc的ondocumentready)。並且會嚴格按照所有defer的script的順序執行。