JS异步加载的三种实现方式


Posted in Javascript onMarch 16, 2017

js加载的缺点:加载工具方法没必要阻塞文档,过多js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。 有些工具方法需要按需加载,用到再加载,不用不加载,。

默认正常模式下下,JS是同步加载的,即优先加载JS,只有当JS文件下载完,dom和css才开始加载,当某些时候我们需要JS异步加载,我们可以通过以下方式来设置异步加载,不同情况下选取不同方式即可

1.defer:defer

  1. JS异步下载,dom结构解析完(标签 + 样式(内容不一定下载完))才异步执行 
  2. 仅IE能用
  3. 内部JS也能用该属性
  4. 异步加载js不允许使用document.write,因为document.write会清除文档流,js标签还未加载就会被清除
  5. document.write()可用于初始化页面

2.(h5)async:async(asynchronous) ajax(asynchronous javascript and XML)

  1. JS异步加载,加载完毕后立刻异步执行
  2. IE8及以下不兼容
  3. 内部JS不能用该属性

3.除了以上两种方法,还有一种兼容自己封装的异步加载方式,即动态添加script标签也能实现异步加载。

function asyncLoaded(url,callBack){/*url为js的链接,callBack为url的js中的函数(该函数调用应该写到匿名函数中,如function(){console.log(div.getScrollOffset())})*/
  var script = document.createElement('script');
  script.type = 'text/javascript';
  /*if else 这几句话必须要写到这位置处,不能放最后,因为if中js加载中script.readyState存在好几种状态,
  只有状态改变‘readystatechange'事件才会触发,但现在浏览器加载速度很快,当解析到该事件时JS有可能已经加载完,
  所以事件根本不会触发,所以要写到前面*/
  if(script.readystate){//兼容IE
    script.onreadystatechange = function() {//状态改变事件才触发
      if(script.readyState == 'loaded' || script.readyState == 'complete'){  
        callBack();
        script.onreadystatechange = null;    
      }
    }
  }else{
    script.onload = function(e){
      callBack();
    }
  }    
  script.src = url;
  document.body.appendChild(script);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习js所必须要知道的一些
Mar 07 Javascript
js每次Title显示不同的名言
Sep 25 Javascript
JQuery 浮动导航栏实现代码
Aug 27 Javascript
JavaScript CSS修改学习第二章 样式
Feb 19 Javascript
深入理解javascript中defer的作用
Dec 11 Javascript
JavaScript基础教程——入门必看篇
May 20 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
微信小程序 获取session_key和openid的实例
Aug 17 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 Javascript
JS表单传值和URL编码转换
Mar 03 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
Aug 09 Javascript
原生js实现弹窗消息动画
Nov 20 Javascript
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 #Javascript
基于JavaScript实现滑动门效果
Mar 16 #Javascript
基于Vue2.0的分页组件
Mar 16 #Javascript
原生js实现验证码功能
Mar 16 #Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 #Javascript
vue图片加载与显示默认图片实例代码
Mar 16 #Javascript
js中作用域的实例解析
Mar 16 #Javascript
You might like
长波有什么东西
2021/03/01 无线电
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
python的常见命令注入威胁
2013/02/18 Python
Python中用altzone()方法处理时区的教程
2015/05/22 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
Python实现打印实心和空心菱形
2019/11/23 Python
python集合删除多种方法详解
2020/02/10 Python
python交互模式基础知识点学习
2020/06/18 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
GWebs公司笔试题
2012/05/04 面试题
如何提高MySql的安全性
2014/06/19 面试题
机械电子工程专业推荐信范文
2013/11/20 职场文书
运动会演讲稿100字
2014/08/25 职场文书
卖车协议书范例
2014/09/16 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
经济纠纷起诉状
2015/05/20 职场文书
会计入职心得体会
2016/01/22 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL