无阻塞加载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 相关文章推荐
jquery实现图片左右间隔滚动特效(可自动播放)
May 08 Javascript
使用jquery自定义鼠标样式满足个性需求
Nov 05 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
7个jQuery最佳实践
Jan 12 Javascript
使用plupload自定义参数实现多文件上传
Jul 19 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
Nov 07 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
Sep 13 Javascript
浅谈Vue为什么不能检测数组变动
Oct 14 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
php 页面执行时间计算代码
2008/12/04 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
python使用cookie库操保存cookie详解
2014/03/03 Python
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
Python代码太长换行的实现
2019/07/05 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
精灵市场:Pixie Market
2019/06/18 全球购物
家长写给老师的建议书
2014/03/13 职场文书
厂区绿化方案
2014/05/08 职场文书
教师教学评估方案
2014/05/09 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
导游词之千岛湖
2019/09/23 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
MySQL视图概念以及相关应用
2022/04/19 MySQL