无阻塞加载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 相关文章推荐
两个DIV等高的JS的实现代码
Dec 23 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 Javascript
jquery中filter方法用法实例分析
Feb 06 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
Sep 24 Javascript
基于Bootstrap实现城市三级联动
Nov 23 Javascript
js中apply()和call()的区别与用法实例分析
Aug 14 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
Nov 18 Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 Javascript
利用vue重构有赞商城的思路以及总结整理
Feb 21 Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 Javascript
JS array数组检测方式解析
May 19 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
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
django 创建过滤器的实例详解
2017/08/14 Python
python求最大连续子数组的和
2018/07/07 Python
学生信息管理系统python版
2018/10/17 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python threading的使用方法解析
2019/08/28 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
党校党性分析材料
2014/12/19 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL