无阻塞加载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 相关文章推荐
js动画(animate)简单引擎代码示例
Dec 04 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
Feb 05 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
Sep 12 Javascript
基于JavaScript实现动态添加删除表格的行
Feb 01 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
Jun 03 Javascript
jQuery复制节点用法示例(clone方法)
Sep 08 Javascript
ajax图片上传,图片异步上传,更新实例
Dec 30 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
详解使用angular的HttpClient搭配rxjs
Sep 01 Javascript
JavaScript中字符串的常用操作方法及特殊字符
Mar 18 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 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/10/04 PHP
PHP重定向的3种方式
2013/03/07 PHP
鼠标经过的文本框textbox变色
2009/05/21 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python实现简单拆分PDF文件的方法
2015/07/30 Python
如何将python中的List转化成dictionary
2016/08/15 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
python构建指数平滑预测模型示例
2019/11/21 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
C++面试题目
2013/06/25 面试题
机械专业毕业生推荐信范文
2013/11/25 职场文书
留学生如何写好自荐信
2013/12/27 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
申请吧主发表的感言
2015/08/03 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书