问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么对js进行异步加载?

发布网友 发布时间:2022-04-22 10:20

我来回答

2个回答

懂视网 时间:2022-04-22 14:41

本篇文章给大家带来的内容是关于JavaScript异步加载的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

讲这个问题之前, 我们从另一个面试高频问题来切入,

我们的web页面从开始解析到页面渲染完成都经历了什么 ?

1、创建document对象, 开始解析页面, 此时document.readyState = 'loading'

2、遇到link标签引入的css文件, 创建线程并异步加载css,继续解析文档

3、遇到script标签引入的外部脚本 , 如果script标签的属性设置了defer或者async 则 创建线程异步加载js , 否则同步加载js(阻塞了dom的解析) , 继续解析文档 (async脚本加载完就执行)

4、遇到img等要加载资源的标签, 正常解析dom 标签 , 异步加载src , 继续解析文档

5、文档解析完毕 , document.readyState = 'interactive' , 所有defer脚本按顺序执行,并且document会触发 DOMContentLoaded事件 , 标志着程序从同步脚本执行阶段转化成事件驱动阶段

6、当所有async 脚本 加载并执行 完毕 , img 加载完毕 , document.readyState = 'complete' , window 触发 load 事件 。

7、从此 以异步响应的方式处理用户输入, 网络事件等 。。。。。。

ok , 光说没用, 我们来看看真相是否只有一个。。。

document.onreadystatechange = () => {
 console.log(document.readyState)
};
document.addEventListener('DOMContentLoaded', () => {
 console.log('DOMContentLoaded')
});
window.onload = () => {
 console.log('load')
};

注意一点, DOMContentLoaded 事件 只能用 addEventListener 来绑定

结果是这样:

按顺序打印出来了 。。。

上文我们提到只有设置了defer /async 的 script 脚本 才能异步加载 ,

注意defer 有些低版本浏览器不兼容,

async是W3C的标准,但只能在引入外部js文件时使用,

当然,我们最常用的是把script标签放在body 后面 ,这样就不会阻塞dom解析

还有一种情况, 动态添加的script脚本也是异步加载的, 基于此 我们来封装一个 异步加载script脚本的函数

function loadScript (url, callback) { // 传入url , 和要执行的回调函数
 const script = document.createElement('script');
 script.type = 'text/javascript'; // 创建一个script标签
 if (script.readyState) { // 做兼容
 script.onreadystatechange = () => { // readyState变化触发
  if (script.readyState === 'complete' || script.readyState === 'loaded') { // 兼容
  callback(); // 加载完执行回调  }
 }
 } else {
 script.onload = () => {
  callback(); // 加载完执行回调 }
 }
 script.src = url;
 document.head.appendChild(script); // 插入head中}

热心网友 时间:2022-04-22 11:49

(function() {
     var s = document.createElement('script');
     s.type = 'text/javascript';
     s.async = true;
     s.src = 'http://www.shouyou888.com/script.js';
     var x = document.getElementsByTagName('head')[0];
     x.appendChild(s);
 })();

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 已知a是27的平方根的整数部分,b是27的平方根的小数部分,a-2b的值是多少? 27的平方根是多少?算术平方根是多少? (如果开不尽,保留3个有效数字) -27的平方根等于 27的平方根是无理数还是有理数?为什么? 27的平方根怎么算 27的平方根是多少。0.0121的立方根是多少。( 我只要答案。不需要公式 - -。公式者 怎么用五笔打出字 下列说法正确的(  ) A.27的平方根是±3 B.27的立方根是±3 C. 27 的平方根 27的平方根 27的平方根是几,还有立方根。 27的平方根等于(结果精确到0.01) 0.0121的立方根等于(结果精确到0.01) 五笔怎么才能打出来字啊 27的平方根等于多少? 五笔"在"字怎么打 27的平方根? 原有的采购离职了,怎么写给供应商的联络函? 求电视剧最佳情侣原声中字 供应商擅自取消订单客户怎么发联络涵 客户的不良退货说是退回,但是我司没有收到退货联络函要咋样写 奥格威的品牌形象理论是什么? 水果醪糟怎么做如何做好吃 水果酒酿好后加温消毒会流失营养吗? 简要说说蝴蝶兰快速育苗? 蝴蝶兰育苗时是否抽芽 诗歌鉴赏之炼字 蝴蝶兰怎样做组织培养 诗歌鉴赏之炼字篇 清华大学有机化学考研用什么书复习比较好 诗词赏析中炼字的答题步骤 高考诗歌鉴赏之炼字 哪个字更恰当 手机打开word为什么没有表格? 语文 炼字 有哪几方面? 手上沾满502胶之后如何处理? 502弄手上怎么处理 百度联盟中的搜索合作推广,是什么?把百度的搜索框弄在网站中,如果有人通过它去搜索了,需要点击搜索出 鱼清炖的做法 清炖理鱼的做法大全 张俪这俩年为什么只上综艺而不拍戏了? 蒙面舞王张俪哪一期 张俪之前资源都挺好的,为什么最近却像是经历瓶颈期?