window.onload和$(document).ready()的区别


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版)- 单东林 张晓菲 魏然 编著


猜你喜欢

转载自blog.csdn.net/Small_Wchen/article/details/73480917