网站首页 > 技术文章 正文
页面加载 JS 顺序或方式不同,可能会导致功能失效、错误的产生或加载解析时间过长,拖慢整个页面展示。
了解 JS 的加载顺序
了解页面元素的加载顺序,找到 JS 执行失败原因。有时明明没有问的代码,可就获取不到元素值或信息,这可能是JS执行时间过早或过晚,而导致的 JS 执行失败。我们来看一幅图,了解defer、async属性对JS下载、执行顺序的影响
- 默认情况下,浏览器解析到JS文件就会立即下载文件,并执行文件,JS提前执行,获取不到页面元素,并导致页面解析中断,拖慢整个页面的加载。
- 添加async属性后,就会异步下载JS文件并执行,执行时间不可控,JS执行时间过早或过晚,而导致的 JS 执行错误或失败。
- 添加defer属性后,就会异步下载JS文件,等页面解析完成后再执行JS
Ready方法的实现
很多时候我们不把JS放在head中,而把JS放到body的最后面也就很好解释了?
- 首先,JS的下载和执行会中断页面的解析,拖慢整个页面展示,
- 然后,放在head中,页面元素还没有加载,JS方法就无法获取或处理页面上的元素,这一点很容易忽视,
- 但是,我们还有ready方法。
jQuery中的ready方法会在页面解析后运行,语法如下:
//语法 1
$(document).ready(function)
//语法 2
$().ready(function)
//语法 3
$(function)
自定义方法,通过监听DOMContentLoaded实现ready方法
/**
* 页面解析后执行 fn
* https://ichochy.com
* /
function ready(fn) {
if (window.addEventListener) {
window.addEventListener('DOMContentLoaded', function () {
//注销时间,避免重复触发
document.removeEventListener('DOMContentLoaded', arguments.callee, false);
fn(); //运行函数
}, false);
} else if (document.attachEvent) { //IE浏览器
document.attachEvent('onreadystatechange', function () {
if (document.readyState == 'complete') {
document.detachEvent('onreadystatechange', arguments.callee);
fn(); //函数运行
}
});
}
}
当然还有我的onload方法,可以在页面完成所有加载后再执行
//window 的 onload
window.onload = function(){
//load https://ichochy.com
//some things ……
}
//body 的 onload
<body onload="load()">
总结
可以看到,JS的执行顺序决定着程序是否正常工作。加载过早,可能无法获取到页面元素,而太晚,页面元素无法交互。对于执行的顺序,要以当前的程序功能而定。
联系方式
网站:https://ichochy.com/
源文:https://ichochy.com/posts/20200807/
猜你喜欢
- 2024-09-12 不得不佩服,美观小巧的网页内容编辑器——ContentTools
- 2024-09-12 监听设备方向变化?分享 1 段优质 JS 代码片段!
- 2024-09-12 一分钟了解ajax。(一分钟了解网络广告)
- 2024-09-12 Jquery一个简单的注册验证(jquery注册点击事件)
- 2024-09-12 [前端请求]Ajax知识点 Jquery接口封装 fetch原生js请求
- 2024-09-12 JQuery笔记(下)(jquery gt)
- 2024-09-12 Vue.js 快速上手(vue.js怎么学)
- 2024-09-12 Ajax 的全面总结(ajax概述)
- 2024-09-12 html file选择文件一次之后就失效了怎么办
- 2024-09-12 jQuery入门2(jquery入门教程)
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1522℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 650℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 460℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)