页面加载 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 (document.addEventListener) {
document.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
的执行顺序决定着程序是否正常工作。加载过早,可能无法获取到页面元素,而太晚,页面元素无法交互。对于执行的顺序,要以当前的程序功能而定。