30秒知识点-表格对比
表1-1 window.onload与$(document).ready()的对比
类别 | window.onload | $(document).ready() |
---|---|---|
执行时机 | 必须等待网页中所有的内容加载完毕后(包括图片)才能执行 | 网页中所有DOM结构绘制完毕后就执行,可能DOM元素关联的东西并没有加载完 |
编写个数 | 不能同时编写多个 以下代码无法正确执行: window.onload = function(){ alert(“test1”) }; window.onload = function(){ alert(“test2”) }; 结果只会输出“test2” | 能同时编写多个 以下代码正确执行: $ (document).ready(function(){alert(“Hello World!”); }); $ (document).ready(function(){alert(“Hello Again!”); }); 结果两次都输出 |
简化写法 | 无 | $ (document).ready(function(){// … }); 可以简写成 $ (function(){// … }); |
具体分析
以浏览器装在文档为例,在页面加载完毕后,浏览器会通过JavaScript为DOM元素添加事件。在常规的JavaScript代码中,通常使用window.onload
方法,而在jQuery中,使用的是$(document).ready()
方法。$(document).ready()
方法是事件模块中最重要的一个函数,可以极大地提高Web应用程序的响应速度。jQuery就是用$(document).ready()
方法来代替传统JavaScript的window.onload方法的。通过使用该方法,可以在DOM载入就绪时就对其进行操纵并调用执行它所绑定的函数。
在使用过程中,需要注意$(document).ready()
方法和window.onload
方法之间的细微区别。
1. 执行时机
window.onload
方法是在网页中的所有元素(包括元素的所有关联文件)完全加载到浏览器后才执行,即JavaScript此时才可以访问网页中的任何元素。而通过jQuery中的$(document).ready()
注册的事件处理程序,在DOM完全就绪时就可以调用。此时,网页中的所有元素对jQuery而言都是可以访问的。但是这并不意味着这些元素关联的文件都已经下载完毕。
举一个例子,为图库网站中所有图片添加某些行为,例如单击图片后让它隐藏或者显示。如果用window.onload
方法来处理,那么用户必须等到每一幅图片都加载完毕后,才可以进行操作。如果使用jQuery中的$(document).ready()
来进行设置,只要DOM就绪就可以操作了,不需要等待所有图片下载完毕。很显然,把网页解析DOM树的速度比把页面中的所有关联文件加载完毕的速度快得多。
另外,需要注意的是,由于在$(document).ready()
方法内注册的时间,只要DOM就绪就会被执行,因此可能此时元素的关联文件未下载完。例如与图片相关的HTML下载完毕,并且已经解析为DOM树了,但有可能图片还未加载完毕,所以例如图片的高度和宽度这样的属性此时不一定有效。
2. 多次使用
假设网页中有两个函数,JavaScript代码如下:
function one() {
alert("one");
}
function two() {
alert("two");
}
当页面加载完毕后,通过如下JavaScript代码来分别调用one函数和two函数:
window.onload = one;
window.onload = two;
然而当运行代码时,会发现只弹出字符串“two”对话框。这是因为JavaScript的onload事件一次只能保存对一个函数的引用,它会自动用后面的函数覆盖前面的函数,因此不能再现有的行为上添加新的行为。
为了达到两个函数顺序触发的效果,只能再创建一个新的JavaScript方法来实现,JavaScript代码如下:
window.onload = function(){
one();
two();
}
虽然这样写能够解决一部分问题,但当多个JavaScript文件都要用到window.onload
方法时则会非常麻烦。另外,在JavaScript中,也可以通过创建一个addLoadEvent函数来将JavaScript分离成单独的文件并允许加载多个函数,但是它需要一定数量且复杂的代码去实现这个功能,相比于jQuery还是多了一些复杂性。此时使用jQuery的$(document).ready()
方法就能够很好地处理这些情况。因为jQuery调用该方法时都会在现有的行为上追加新的行为,这些行为函数会根据注册的顺序依次执行,将上面的JavaScript代码进行修改就会得到预想的输出效果:
function one(){
alert("one");
}
function two(){
alert("two");
}
$document.ready(function(){
one();
});
$document.ready(function(){
two();
});
3. 简写方式
在jQuery中,下面三段代码表示同样的功能,方法2是方法1的简写方式。
/* 方法1 */
$(document).ready(function(){
// function body...
})
/* 方法2 */
$(function(){
// function body...
})
/* 方法3 */
$().ready(function(){
// function body...
})
参考资料
《锋利的jQuery》(第2版)- 单东林 张晓菲 魏然 编著