无阻塞加载js,防止因js加载不了影响页面显示的问题


Posted in Javascript onDecember 18, 2016

浏览器加载静态资源和js的方式都是线性加载,所以一般情况可以将js放到</body>前,防止UI线程的阻塞。

而某些时候我们既希望js在整个网页的头部就加载,又担心js阻塞导致网站加载缓慢,就可以用到无阻塞加载js技术。

Dynamic Script Elements 动态脚本元素

DOM允许我们使用Javascript动态创建HTML的几乎所有文档内容,一个新的<script>元素可以非常容易的通过标准DOM创建:

var script = document.createElement ("script"); 
script.type = "text/javascript"; 
script.src = "file1.js";  
document.body.appendChild(script);

新的<script>元素加载file1.js源文件。此文件当元素添加到页面后立刻开始下载。此技术的重点在于:无论在何处启动下载,文件的下载和运行都不会阻塞其他页面处理过程。

当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了Firefox和Opera,它们将等待此前的所有动态脚本节点执行完毕)。

大多数情况下,我们希望调用一个函数就可以实现Javascript文件的动态下载。下面的函数封装实现了标准实现和IE实现:

function loadScript(url, callback){ 
  var script = document.createElement ("script") ; 
  script.type = "text/javascript"; 
    
  if (script.readyState){ //IE 
    script.onreadystatechange = function(){ 
     if (script.readyState == "loaded" || script.readyState == "complete"){ 
      script.onreadystatechange = null; 
      callback();  
     } 
    }; 
   }  
   else { //Others 
    script.onload = function(){ callback(); 
   };  
  } 
  script.src = url; 
  document.getElementsByTagName("head")[0].appendChild(script);  
 } 
 
loadScript("file1.js", function(){ //调用 
  alert("File is loaded!");  
});

此函数接受两个参数:Javascript文件的Url和一个当Javascript接收完成时触发的回调函数。属性检查用于决定监视哪种事件。最后一步src属性,并将javascript文件添加到head。

动态脚本加载是非阻塞Javascript下载中最常用的模式,因为它可以跨浏览器,而且简单易用。

以上这篇无阻塞加载js,防止因js加载不了影响页面显示的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 函数及作用域总结介绍
Nov 12 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
Sep 09 Javascript
jQuery的one()方法用法实例
Jan 19 Javascript
Vue.js快速入门教程
Sep 07 Javascript
JS常用函数和常用技巧小结
Oct 15 Javascript
利用require.js与angular搭建spa应用的方法实例
Jul 19 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 Javascript
vue+element实现表单校验功能
May 20 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 jQuery
OpenLayers3实现地图显示功能
Sep 25 Javascript
vue实现Toast组件轻提示
Apr 10 Vue.js
Node.js连接postgreSQL并进行数据操作
Dec 18 #Javascript
纯js实现悬浮按钮组件
Dec 17 #Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
Dec 17 #Javascript
Bootstrap CSS组件之按钮下拉菜单
Dec 17 #Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
Dec 17 #Javascript
Bootstrap CSS组件之按钮组(btn-group)
Dec 17 #Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
Dec 17 #Javascript
You might like
PHP 第二节 数据类型之数值型
2012/04/28 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
深入php list()函数的详解
2013/06/05 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
用Python进行基础的函数式编程的教程
2015/03/31 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
教师队伍管理制度
2014/01/14 职场文书
上课迟到检讨书
2014/02/19 职场文书
绿色环保口号
2014/06/12 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
Flask response响应的具体使用
2021/07/15 Python