script的兩個屬性——async和defer:
① 沒有defer或async,瀏覽器會立即加載并執(zhí)行指定的JS腳本,不等待后續(xù)文檔元素,讀到JS腳本就加載并執(zhí)行。
② 有async,加載后續(xù)文檔元素的過程將和JS的加載與執(zhí)行并行進行(異步)。
③ 有defer,加載后續(xù)文檔元素的過程將和JS的加載并行進行(異步),但JS的執(zhí)行要在所有文檔元素解析完成之后,DOMContentLoaded 事件觸發(fā)之前完成。
二者的詳細(xì)對比請見:http://blog.csdn.net/zhouziyu2011/article/details/60149590
script放在底部的原理:
script沒有async和defer時,JS文件將在下載后立即執(zhí)行。這種情況下,script放在頂部會阻塞頁面呈現(xiàn),在網(wǎng)速慢的情況下會導(dǎo)致“白屏”,直到腳本下載完畢才繼續(xù)呈現(xiàn)頁面。因此,script放在底部可以讓頁面盡快呈現(xiàn)。
script全部放在head中會出現(xiàn)的問題:
在需要操作body中的某元素時,可能找不到該元素,因此,若要放在head中,一般需要綁定一個監(jiān)聽windows.onload=function(){ ... },當(dāng)文檔全部解析完之后再執(zhí)行script代碼。
測試實例:
測試demo:http://stevesouders.com/hpws/move-scripts.php
頁面中嵌入2個iframe,左邊是script放在頂部的情況,右邊是script放在底部的情況。