无阻塞加载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一些实用技巧小结
Mar 18 Javascript
JavaScript 判断浏览器是否支持SVG的代码
Mar 21 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
Mar 26 Javascript
JavaScript显示表单内元素数量的方法
Apr 02 Javascript
JavaScript实现信用卡校验方法
Apr 07 Javascript
每天一篇javascript学习小结(String对象)
Nov 18 Javascript
AngularJS压缩JS技巧分析
Nov 08 Javascript
javascript中Number的方法小结
Nov 21 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
Dec 17 Javascript
uni app仿微信顶部导航条功能
Sep 17 Javascript
微信用户访问小程序的登录过程详解
Sep 20 Javascript
浅谈JavaScript 声明提升
Sep 14 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中文分词 自动获取关键词介绍
2012/11/13 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
PHP修改session_id示例代码
2014/01/08 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
JavaScript高级程序设计 事件学习笔记
2011/09/10 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
Python合并多个Excel数据的方法
2018/07/16 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
入党转预备思想汇报
2014/01/07 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
应聘护士求职信
2014/07/21 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
污水处理保证书
2015/05/09 职场文书
会计试用期工作总结2015
2015/05/28 职场文书