无阻塞加载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 相关文章推荐
dojo 之基础篇(二)之从服务器读取数据
Mar 24 Javascript
动态刷新 dorado树的js代码
Jun 12 Javascript
javascript学习笔记(十) js对象 继承
Jun 19 Javascript
javascript实现设置、获取和删除Cookie的方法
Jun 01 Javascript
详解javascript数组去重问题
Nov 06 Javascript
Knockoutjs 学习系列(二)花式捆绑
Jun 07 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
Oct 10 Javascript
代码实例ajax实现点击加载更多数据图片
Oct 12 Javascript
Vue源码探究之状态初始化
Nov 14 Javascript
RxJS的入门指引和初步应用
Jun 15 Javascript
Vue.js数字输入框组件使用方法详解
Oct 19 Javascript
基于JS实现快速读取TXT文件
Aug 25 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
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
python实现sublime3的less编译插件示例
2014/04/27 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
学前教育教师求职自荐信
2013/09/22 职场文书
我为自己代言广告词
2014/03/18 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
爱国演讲稿400字
2014/05/07 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
培训班通知
2015/04/25 职场文书
新学期家长寄语2016
2015/12/03 职场文书
安全责任协议书范本
2016/03/23 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js