爲了加快首屏響應速度,前端會採用代碼切割、按需加載等方式優化性能。異步加載script也是一種前端優化的手段。html
就比如若是個人頁面其中一個功能須要打開地圖,可是地圖的js插件包是很是大的,而若是用戶不用地圖功能的時候,咱們固然不能再給它加載js地圖包,白白讓他多花等待時間豈不是很冤枉!因而咱們能夠動態插入script,當用戶點擊了某個按鈕的時候,再新建script標籤,引入地圖js資源。前端
下面介紹下異步加載script的幾種方式。ajax
getMap.onclick = function(){ //得到須要插入的位置 var oDiv = document.getElementById('div'); //異步建立script var script = document.createElement('script'); script.src = 'https://map.baidu.com/...' oDiv.appendChild(script); }
script標籤存在兩個屬性,defer和async,加上兩個屬性以後,在js真正執行以前都不會阻止html的加載。所以script標籤的使用分爲三種狀況:瀏覽器
<script src="example.js"></script>
<script async src="example.js"></script>
<script defer src="example.js"></script>
下圖能夠直觀的看出三者之間的區別:
其中藍色表明js腳本網絡加載時間,紅色表明js腳本執行時間,綠色表明html解析。網絡
從圖中咱們能夠明確一下幾點:app
1.defer和async在網絡加載過程是一致的,都是異步執行的;前端優化
2.二者的區別在於腳本加載完成以後什麼時候執行,能夠看出defer更符合大多數場景對應用腳本加載和執行的要求;異步
3.若是存在多個有defer屬性的腳本,那麼它們是按照加載順序執行腳本的;而對於async,它的加載和執行是牢牢挨着的,不管聲明順序如何,只要加載完成就馬上執行,它對於應用腳本用處不大,由於它徹底不考慮依賴。async
轉載於:https://www.cnblogs.com/neusc/archive/2016/08/12/5764162.html函數
window.onload = function(){ //1.建立XMLHttpRequest對象並考慮兼容性 var xhr; if(window.XMLHttpRequest){ //通用瀏覽器 xhr = new XMLHttpRequest(); } else{ //IE5/6 xhr = new ActiveXObject('Miscrosoft.XMLHttp') } //2.設置請求方式 let url = ''; xhr.open('get', url, true);//異步請求 //3.發送請求 xhr.send(); //4.回調函數 xhr.onreadyStateChange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ let script = xhr.responseText; eval(script); //異步加載script } } }
var iframe = document.createElement('iframe'); document.body.appendChild(iframe); var doc = iframe.contentWindow.document; doc.open().write('<body onload="insertJS()">'); doc.close();