默認(rèn)情況下javascript是同步加載的匕累,后面的元素要等待javascript加載完畢后才能再次進(jìn)行加載棍郎,對于一些不重要的javascript,如果放在head中會導(dǎo)致網(wǎng)頁加載速度變慢。 以下是javascript異步加載的三種方案泉粉。
1 .defer
異步加載卵慰,但要等到dom文檔全部解析完才會被執(zhí)行沙郭。只有IE能用。
<script type="text/javascript" defer="defer">
//代碼區(qū)
</script>
2. async:
異步加載呵燕,加載完就執(zhí)行棠绘,async只能加載外部腳本,不能把js寫在script 標(biāo)簽里再扭。
<script type="text/javascript" src="demo.js" async="async"></script>
注釋:有多種執(zhí)行外部腳本的方法:
? 如果 async="async":腳本相對于頁面的其余部分異步地執(zhí)行(當(dāng)頁面繼續(xù)進(jìn)行解析時氧苍,腳本將被執(zhí)行)
? 如果不使用 async 且 defer="defer":腳本將在頁面完成解析時執(zhí)行
? 如果既不使用 async 也不使用 defer:在瀏覽器繼續(xù)解析頁面之前,立即讀取并執(zhí)行腳本
3.創(chuàng)建script泛范,插入到DOM中让虐,加載完畢后callBack
function asyncLoaded(url, callBack) {
var script = document.createElement('script');
script.type = 'text/javascript';
if (script.readystate) {//兼容IE
script.onreadystatechange = function () {//狀態(tài)改變觸發(fā)事件
if (script.readyState == 'loaded' || script.readyState == 'complete') {
callBack();
script.onreadystatechange = null;
}
}
} else {
script.onload = function (e) {
callBack();
}
}
script.src = url;
document.body.appendChild(script);
}