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 相关文章推荐
IE iframe的onload方法分析小结
Jan 07 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
Dec 12 Javascript
js对文章内容进行分页示例代码
Mar 05 Javascript
JavaScript编程中容易出BUG的几点小知识
Jan 31 Javascript
JQuery选择器、过滤器大整理
May 26 Javascript
jQuery编程中的一些核心方法简介
Aug 14 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
Nov 27 Javascript
React-router v4 路由配置方法小结
Aug 08 Javascript
详解Vue-Cli 异步加载数据的一些注意点
Aug 12 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
Mar 12 Javascript
解决layer.msg 不居中 ifram中的问题
Sep 05 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 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
星际争霸秘籍
2020/03/04 星际争霸
php adodb连接不同数据库
2009/03/19 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php中hashtable实现示例分享
2014/02/13 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
javascript操作符"!~"详解
2015/02/10 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
JS二分查找算法详解
2017/11/01 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Python使用装饰器进行django开发实例代码
2018/02/06 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
对Python函数设计规范详解
2019/07/19 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
仓库文员岗位职责
2014/04/06 职场文书
目标责任书格式范文
2015/05/11 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
欠条格式范本
2015/07/03 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python
解决Redis启动警告问题
2022/02/24 Redis
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python