无阻塞加载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中的16进制字符(改进)
Nov 21 Javascript
js 调用父窗口的具体实现代码
Jul 15 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 Javascript
AngularJS快速入门
Apr 02 Javascript
JavaSacript中charCodeAt()方法的使用详解
Jun 05 Javascript
基于JavaScript代码实现随机漂浮图片广告
Jan 05 Javascript
JS实现的在线调色板实例(附demo源码下载)
Mar 01 Javascript
javascript中sort排序实例详解
Jul 24 Javascript
vue一步步实现alert功能
Jul 05 Javascript
jQuery选择器之表单元素选择器详解
Sep 19 jQuery
详解html-webpack-plugin用法全解
Jan 22 Javascript
JavaScript运动原理基础知识详解
Apr 02 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极大的增强功能和性能
2006/10/09 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
php-fpm中max_children的配置
2019/03/15 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
js 目录列举函数
2008/11/06 Javascript
javascript 常用方法总结
2009/06/03 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
python实现按长宽比缩放图片
2018/06/07 Python
python 内置函数汇总详解
2019/09/16 Python
python装饰器原理与用法深入详解
2019/12/19 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
资料员岗位职责
2013/11/17 职场文书
行政副总岗位职责
2014/02/23 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
5行Python代码实现一键批量扣图
2021/06/29 Python
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang