无阻塞加载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 Prototype对象
Jan 07 Javascript
JavaScript DOM 学习第三章 内容表格
Feb 19 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
document.write()及其输出内容的样式、位置控制
Aug 12 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
javascript转换日期字符串为Date日期对象的方法
Feb 13 Javascript
js removeChild 方法深入理解
Aug 16 Javascript
教你一步步用jQyery实现轮播器
Dec 18 Javascript
JavaScript实现图像模糊化的方法实例
Jan 15 Javascript
vue模式history下在iis中配置流程
Apr 17 Javascript
防止Layui form表单重复提交的实现方法
Sep 10 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
Jan 26 Javascript
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
8个出色的WordPress SEO插件收集
2011/02/26 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
关于js类的定义
2011/06/28 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
Node.js的特点详解
2017/02/03 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
python获取糗百图片代码实例
2013/12/18 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
python并发和异步编程实例
2018/11/15 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
应届毕业生求职信范例分享
2013/12/17 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
五四青年节的活动方案
2014/08/20 职场文书
班主任自我评价范文
2015/03/11 职场文书
自我推荐信怎么写
2015/03/24 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
nginx配置之并发频次限制
2022/04/18 Servers