javascript延迟加载

2017-09-04  本文已影响450人  落花的季节

有些 js 代码并不是页面初始化的时候就立刻需要的,而稍后的某些情况才需要的。延迟加载就是一开始并不加载这些暂时不用的js,而是在需要的时候或稍后再通过js 的控制来异步加载。

实现延迟加载的方式有很多种:

1.直接将script节点放置在</body>之前,这样js脚本就会在页面显示出来之后再加载。
但是这种方法有时候会收到google延时加载js的警告,处理这种问题的方法:
在body底部加入如下代码:

<script type='text/javascript'>
function downloadJSAtOnload(){
  var element = document.createElement('script');
  element.src = 'test.js';
  document.body.appendChild(element);
}
if(window.addEventListener){
  window.addEventListener('load',downloadJSAtOnload,false);
}
else if(window.attachEvent){
  window.attachEvent('onload',downloadJSAtOnload)
}
else{
  window.onload = downloadJSAtOnload;
}
</script>

2.使用script标签的defer和async属性。

3.通过监听onload事件,动态添加script节点:
Firefox,Opera,Chrome,Safari的方式:

var script = document.createElement('script');
script.type = 'text/javascript';
script.onload = function(){
  alert('script loaded');
}
script.src = 'test.js';
document.getElementByTagName('head')[0].appendChild(script);

IE的方式

var script = document.createElement('script');
script.type = 'text/javascript';
script.onreadystatechange = function(){
  if(script.readyState == 'loaded' || script.readyState == 'complete'){
    script.onreadystatechange = null;
    alert('script loaded');
  }
}
script.src = 'test.js';
document.getElementByTagName('head')[0].appendChild(script);

其实IE和其它浏览器加载添加节点的方式都一样,只是加载之后监听是否成功的事件不一样,其实这个不需要也无所谓。

4.通过ajax下载js脚本,动态添加script标签

var xhr = new XMLHttpRequest();
xhr.open('get','test.js',true);
xhr.onreadystatachange = function(){
  if(xhr.readyState == 4){
    if(xhr.state >= 200 && xhr.state < 300 || xhr.state == 304){
      var script = document.createElement('script');
      script.type = 'text/javascript';
      script.text = xhr.requestText;
      document.body.appendChild(script);
    }
  }
}
xhr.send(null);

上一篇下一篇

猜你喜欢

热点阅读