亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS同步、異步、延遲加載的方法

2024-05-06 16:44:05
字體:
來源:轉載
供稿:網友

本文講述了JS同步、異步、延遲加載的方法。分享給大家供大家參考,具體如下:

一:同步加載

我們平時使用的最多的一種方式。

<script src="http://yourdomain.com/script.js"></script>

同步模式,又稱阻塞模式,會阻止瀏覽器的后續處理,停止后續的解析,只有當當前加載完成,才能進行下一步操作。所以默認同步執行才是安全的。但這樣如果js中有輸出document內容、修改dom、重定向等行為,就會造成頁面堵塞。所以一般建議把<script>標簽放在<body>結尾處,這樣盡可能減少頁面阻塞。

二:異步加載

異步加載又叫非阻塞加載,瀏覽器在下載執行js的同時,還會繼續進行后續頁面的處理。主要有三種方式。

方法一:也叫Script DOM Element

(function(){ var scriptEle = document.createElement("script"); scriptEle.type = "text/javasctipt"; scriptEle.async = true; scriptEle.src = "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js"; var x = document.getElementsByTagName("head")[0]; x.insertBefore(scriptEle, x.firstChild);  })();

<async>屬性是HTML5中新增的異步支持。此方法被稱為Script DOM Element 方法。Google Analytics 和 Google+ Badge 都使用了這種異步加載代碼。

(function(){; var ga = document.createElement('script');  ga.type = 'text/javascript';  ga.async = true;  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';  var s = document.getElementsByTagName('script')[0];  s.parentNode.insertBefore(ga, s); })();

但是這種加載方式執行完之前會阻止onload事件的觸發,而現在很多頁面的代碼都在onload時還執行額外的渲染工作,所以還是會阻塞部分頁面的初始化處理。

方法二:onload時的異步加載

(function(){ if(window.attachEvent){ window.attachEvent("load", asyncLoad); }else{ window.addEventListener("load", asyncLoad); } var asyncLoad = function(){ var ga = document.createElement('script');  ga.type = 'text/javascript';  ga.async = true;  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';  var s = document.getElementsByTagName('script')[0];  s.parentNode.insertBefore(ga, s); })();

這種方法只是把插入script的方法放在一個函數里面,然后放在window的onload方法里面執行,這樣就解決了阻塞onload事件觸發的問題。

注:DOMContentLoaded與load的區別。前者是在document已經解析完成,頁面中的dom元素可用,但是頁面中的圖片,視頻,音頻等資源未加載完,作用同jQuery中的ready事件;后者的區別在于頁面所有資源全部加載完畢。

方法三:其他方法

由于JavaScript的動態性,還有很多異步加載方法: XHR Injection、 XHR Eval、 Script In Iframe、 Script defer屬性、 document.write(script tag)。

XHR Injection(XHR 注入):通過XMLHttpRequest來獲取javascript,然后創建一個script元素插入到DOM結構中。ajax請求成功后設置script.text為請求成功后返回的responseText。

 //獲取XMLHttpRequest對象,考慮兼容性。 var getXmlHttp = function(){ var obj; if (window.XMLHttpRequest)  obj = new XMLHttpRequest(); else  obj = new ActiveXObject("Microsoft.XMLHTTP"); return obj; };  //采用Http請求get方式;open()方法的第三個參數表示采用異步(true)還是同步(false)處理 var xmlHttp = getXmlHttp(); xmlHttp.open("GET", "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js", true); xmlHttp.send();  xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState == 4 && xmlHttp.status == 200){  var script = document.createElement("script");  script.text = xmlHttp.responseText;  document.getElementsByTagName("head")[0].appendChild(script); } } 

XHR Eval:與XHR Injection對responseText的執行方式不同,直接把responseText放在eval()函數里面執行。 

//獲取XMLHttpRequest對象,考慮兼容性。 var getXmlHttp = function(){ var obj; if (window.XMLHttpRequest)  obj = new XMLHttpRequest(); else  obj = new ActiveXObject("Microsoft.XMLHTTP"); return obj; };  //采用Http請求get方式;open()方法的第三個參數表示采用異步(true)還是同步(false)處理 var xmlHttp = getXmlHttp(); xmlHttp.open("GET", "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js", true); xmlHttp.send();  xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState == 4 && xmlHttp.status == 200){  eval(xmlHttp.responseText);  //alert($);//可以彈出$,表明JS已經加載進來。click事件放在其它出會出問題,應該是還沒加載進來  $("#btn1").click(function(){  alert($(this).text());  }); } }

Script In Irame:在父窗口插入一個iframe元素,然后再iframe中執行加載JS的操作。

 var insertJS = function(){alert(2)}; var iframe = document.createElement("iframe"); document.body.appendChild(iframe); var doc = iframe.contentWindow.document;//獲取iframe中的window要用contentWindow屬性。 doc.open(); doc.write("<script>var insertJS = function(){};<//script><body onload='insertJS()'></body>"); doc.close();

GMail Mobile:業內JS內容被注釋,所以不會執行,在需要的時候,獲取script中的text內容去掉注釋,調用eval()執行。

 <script type="text/javascript">  /*  var ...  */  </script>

 

HTML5新屬性:async和defer屬性
defer屬性:IE4.0就出現。defer屬聲明腳本中將不會有document.write和dom修改。瀏覽器會并行下載其他有defer屬性的script。而不會阻塞頁面后續處理。注:所有的defer腳本必須保證按順序執行的。

    <script type="text/javascript" defer></script>

async屬性:HTML5新屬性。腳本將在下載后盡快執行,作用同defer,但是不能保證腳本按順序執行。他們將在onload事件之前完成。

    <script type="text/javascript" defer></script>

Firefox 3.6、Opera 10.5、IE 9和最新的Chrome和Safari都支持async屬性??梢酝瑫r使用async和defer,這樣IE 4之后的所有IE都支持異步加載。

沒有async屬性,script將立即獲?。ㄏ螺d)并執行,期間阻塞了瀏覽器的后續處理。如果有async屬性,那么script將被異步下載并執行,同時瀏覽器繼續后續的處理。

總結: 對于支持HTML5的瀏覽器,實現JS的異步加載只需要在script元素中加上async屬性,為了兼容老版本的IE還需加上defer屬性;對于不支持HTML5的瀏覽器(IE可以用defer實現),可以采用以上幾種方法實現。原理基本上都是向DOM中寫入script或者通過eval函數執行JS代碼,你可以把它放在匿名函數中執行,也可以在onload中執行,也可以通過XHR注入實現,也可以創建一個iframe元素,然后在iframe中執行插入JS代碼。

三:延遲加載

有些JS代碼在某些情況在需要使用,并不是頁面初始化的時候就要用到。延遲加載就是為了解決這個問題。將JS切分成許多模塊,頁面初始化時只加載需要立即執行的JS,然后其它JS的加載延遲到第一次需要用到的時候再加載。類似圖片的延遲加載。

JS的加載分為兩個部分:下載和執行。異步加載只是解決了下載的問題,但是代碼在下載完成后就會立即執行,在執行過程中瀏覽器處于阻塞狀態,響應不了任何需求。

解決思路:為了解決JS延遲加載的問題,可以利用異步加載緩存起來,但不立即執行,需要的時候在執行。如何進行緩存呢?將JS內容作為Image或者Object對象加載緩存起來,所以不會立即執行,然后在第一次需要的時候在執行。

1:模擬較長的下載時間:

利用thread讓其sleep一段時間在執行下載操作。

2:模擬較長的JS代碼執行時間

var start = Number(new Date());while(start + 5000 > Number(new Date())){//執行JS}

這段代碼將使JS執行5秒才完成!

JS延遲加載機制(LazyLoad):簡單來說,就是在瀏覽器滾動到某個位置在觸發相關的函數,實現頁面元素的加載或者某些動作的執行。如何實現瀏覽器滾動位置的檢測呢?可以通過一個定時器來實現,通過比較某一時刻頁面目標節點位置和瀏覽器滾動條高度來判斷是否需要執行函數。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久影视三级福利片| 久久精品精品电影网| 疯狂蹂躏欧美一区二区精品| 性欧美长视频免费观看不卡| 久久国内精品一国内精品| 九九热精品视频在线播放| 欧美日韩不卡合集视频| 欧美另类在线观看| 久久精品福利视频| 一本一本久久a久久精品综合小说| 青青草一区二区| 国模精品一区二区三区色天香| 国内精品视频久久| 国产精品久久久久久久久久新婚| 国产91精品在线播放| 日韩小视频网址| 亚洲欧美视频在线| 久久影视电视剧免费网站| 欧美性xxxx极品hd欧美风情| 欧美一区亚洲一区| 欧美成在线视频| 日韩中文字幕在线观看| 97精品视频在线| 久久久久久久久久久人体| 国产日韩欧美在线观看| 91爱视频在线| 亚洲国产小视频| 欧日韩不卡在线视频| 国产精品夜间视频香蕉| 久久精品99久久香蕉国产色戒| 亚洲一区二区中文字幕| 欧美成年人视频网站欧美| 国产精品免费小视频| 国产女人18毛片水18精品| 国产成人在线一区二区| 日韩黄色高清视频| 久久夜色精品亚洲噜噜国产mv| 欧美精品激情视频| 久久久www成人免费精品| 黑人巨大精品欧美一区二区三区| 日韩免费精品视频| 久久亚洲欧美日韩精品专区| 日韩资源在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 成人网址在线观看| 欧美精品在线视频观看| 在线观看亚洲视频| 国内成人精品视频| 欧美一级视频免费在线观看| 亚洲人成亚洲人成在线观看| 国产精品91免费在线| 久久伊人精品天天| 国产成人综合精品| 亚洲三级 欧美三级| 久久久精品2019中文字幕神马| 国产视频自拍一区| 亚洲欧美国产一区二区三区| 亚洲成av人片在线观看香蕉| 麻豆成人在线看| 91九色蝌蚪国产| 国产美女直播视频一区| 亚洲www在线| 欧美一区二区三区精品电影| 亚洲精品久久在线| 日韩福利视频在线观看| 97视频在线观看网址| 国产成人97精品免费看片| 2019av中文字幕| 久久久久久久久久亚洲| 日韩成人小视频| 欧美日韩国产影院| 亚洲影院高清在线| 高潮白浆女日韩av免费看| 亚洲一区二区三区sesese| 不卡毛片在线看| 亚洲欧美日韩高清| 精品国内自产拍在线观看| 国产精品91在线观看| 91色精品视频在线| 色偷偷av亚洲男人的天堂| 大胆人体色综合| 日韩在线一区二区三区免费视频| 国产z一区二区三区| 亚洲美女中文字幕| 日韩精品亚洲精品| 高跟丝袜一区二区三区| 96pao国产成视频永久免费| 久久最新资源网| 最近中文字幕日韩精品| 日韩免费观看网站| 国产91精品久| 久久精品99久久久香蕉| 美女久久久久久久久久久| 亚洲国产精品va在看黑人| 国产欧美va欧美va香蕉在| 在线精品高清中文字幕| 久久视频这里只有精品| 黑丝美女久久久| 国产精品久久久久久久7电影| 久久免费少妇高潮久久精品99| 亚洲图片欧洲图片av| 激情久久av一区av二区av三区| 爱福利视频一区| 国产噜噜噜噜噜久久久久久久久| 亚洲福利视频专区| 在线观看久久av| 日韩电影网在线| 久久精品国产电影| 国产美女高潮久久白浆| 成人精品久久av网站| 欧美在线一级va免费观看| 欧美国产日本在线| 亚洲japanese制服美女| 欧美最顶级的aⅴ艳星| 国产剧情日韩欧美| 97人洗澡人人免费公开视频碰碰碰| 日韩女在线观看| 欧美日韩国产一区在线| 亚洲精品国产欧美| 国产精品久久久| 岛国av一区二区三区| 亚洲国产欧美一区二区丝袜黑人| 国产一区二区三区直播精品电影| 在线观看欧美视频| 国产日韩欧美影视| 久久久久国产精品www| 欧美性猛交99久久久久99按摩| 中日韩美女免费视频网址在线观看| 国产精品久久久久久一区二区| 久久av红桃一区二区小说| 久久色免费在线视频| 久久久久久亚洲精品| 亚洲欧美激情在线视频| 北条麻妃一区二区在线观看| 国产午夜精品全部视频播放| 国产精品成人一区二区三区吃奶| 成人中心免费视频| 国产精品小说在线| 亚洲人成77777在线观看网| 久久久久一本一区二区青青蜜月| 国产成人精品国内自产拍免费看| 91精品国产自产在线观看永久| 狠狠躁夜夜躁人人爽天天天天97| 国产精品热视频| 欧美成人精品xxx| 中文字幕欧美日韩在线| 久久精品电影网站| 国产日韩在线免费| 国产成人精品网站| 日本精品一区二区三区在线播放视频| 国产精品自产拍在线观看| 国产精品十八以下禁看| 欧美精品做受xxx性少妇| 色综合色综合久久综合频道88| 亚洲片在线资源| 在线成人激情黄色| 成人激情在线观看| 国产精品99久久99久久久二8| 亚洲二区中文字幕| 亚洲欧洲国产一区| 永久免费毛片在线播放不卡| 中文字幕亚洲综合久久筱田步美| 精品免费在线视频| 国产精品一区=区|