无阻塞加载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 :first选择器使用介绍
Aug 09 Javascript
javascript 数组排序函数sort和reverse使用介绍
Nov 21 Javascript
jQuery操作动态生成的内容的方法
May 28 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
May 07 Javascript
vue使用监听实现全选反选功能
Jul 06 Javascript
js实现图片上传并预览功能
Aug 06 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
Apr 30 Javascript
通过Kettle自定义jar包供javascript使用
Jan 29 Javascript
vue 弹出遮罩层样式实例
Jul 22 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
Nov 06 Javascript
Vue实现小购物车功能
Dec 21 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目录管理函数小结
2008/09/10 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
python原始套接字编程示例分享
2014/02/21 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
python 对象和json互相转换方法
2018/03/22 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
Python3.9新特性详解
2020/10/10 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
HTML5地理定位实例
2014/10/15 HTML / CSS
奥巴马胜选演讲稿
2014/05/15 职场文书
汽车专业求职信
2014/06/05 职场文书
企业安全标语
2014/06/07 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
财务统计员岗位职责
2015/04/14 职场文书
罗马假日观后感
2015/06/08 职场文书
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android