首頁 > web前端 > js教程 > 主體

JS非同步載入方法

一个新手
發布: 2017-09-21 10:00:14
原創
1779 人瀏覽過


defer與async

  • #defer

html4為script標籤定義了擴充屬性: defer。 defer指明本元素所含的腳本不會修改dom,因此程式碼能安全地延遲執行。但是該屬性並不是理想的跨瀏覽器解決方案。此屬性只有IE4+和firefox3.5+的瀏覽器支援。用法如下:

<script type=&#39;text/javascript&#39; src=&#39;test.js&#39; defer></script>
登入後複製

帶有defer屬性的''script''標籤可以放置在文件的任何位置,當一個帶有defer屬性js檔案下載時,它不會阻塞瀏覽器的其他進程,因此這類文件可以與頁面中的其他資源並行下載。 帶有defer屬性的script標籤在dom載入完成(onload事件觸發前執行)

  • #async
    html5規範引入了async屬性,用於非同步加載腳本。

 <script type=&#39;text/javascript&#39; src=&#39;test.js&#39; async></script>
登入後複製

async與defer的相同點是採用並行下載,在下載的過程中不會產生阻塞。差別在於async是載入完成後自動執行,而defer則需要等待頁面完成後執行。

動態創建script

主要原理:javascript可以動態創建html中幾乎所有的內容,所以我們可以利用javascript動態地創建script標籤並添加到html中。

var script = document.createElement("script");
  script.type = "text/javasctipt";
  script.src = "file.js";
  document.getElementByTagName("head")[0].appendChild(script)
登入後複製

我們可以使用以下方法追蹤並確保腳本下載完成並準備就緒:

function loadScript(url,callback){var script = document.createElement("script");
  script.type = "text/javasctipt";  //IE
  if(script.readyState){
        script.onreadystatechange = function(){
            if(script.readyState == &#39;loaded&#39;||script.readyState ==&#39;complete&#39;){
    script.onreadystatechange = null;
    callback()
}
}  
}else{
    script.onload = function(){
    callback();
}
}
script.src = url;
document.getElementByTagName("head")[0].appendChild(script)
}
登入後複製

呼叫方法:

loadScript(&#39;files.js&#39;,function(){
    alert("file is loaded")
})
登入後複製

XMLHttpRequest腳本注入

透過XHR物件取得腳本並注入到頁面

/获取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", "file3.js", true);

  xmlHttp.onreadystatechange = function(){
    if (xmlHttp.readyState == 4 {    if(xmlHttp.status >=200 && xmlHttp.status<300 || xmlHttp.status == 304){ var script = document.createElement("script");
      script.text = xmlHttp.responseText;
      document.body.appendChild(script);
}
    }
  } 
  xmlHttp.send(null);
登入後複製
#

以上是JS非同步載入方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!