首页 > 代码库 > $(document).ready() 、window.onload、body.Onload()、 $(window).load、image.onload的区别

$(document).ready() 、window.onload、body.Onload()、 $(window).load、image.onload的区别

 首先说说window和document,直观上来讲,window代表的是浏览器窗口,而document代表的是浏览器窗口中加载的dom元素,进一步说,document是window的一个属性,window是最顶级的对象。

      二者有啥区别呢?很好理解,假设现在有一个浏览器,里边加载的页面特别长,已经超出了一屏,当然,肯定会出现滚动条了,这时候,$(window).height()和$(document).height()是不相等的,document的高度肯定要比window的大,因为window窗口始终就是那么大。

再说说load事件和ready事件(这里的load和ready是指jQuery的事件,下同)。

      先说load,load事件主要就是用来代替原生的window.onload,它只能用在两个场景下:

            ·  window对象上。比如$(window).load(fn);。

            ·  带有URL的元素(images, scripts, frames, iframes)。比如$(“img”).load(fn);。

 除此之外,任何元素都没有load事件,比如:$(document).load(fn);这是错误的写法,根本不会执行。

  load事件需要页面完全加载完成才可以触发,所谓的完全加载完,不仅仅是dom结构加载完,还需要所有的链接引用都加载完才可以。比如页面中有大量图片,必须等每一个图片都加载完成,才叫完全加载完。


最重要的还没说,jQuery官方文档明确说明load事件的跨浏览器兼容性很差(It doesn‘t work consistently nor reliably cross-browser)。经过小菜测试,谷歌浏览器仅仅支持$(window).load(fn);,而火狐浏览器支持$(window).load(fn);和$(“img”).load(fn);。

      所以,除非必要情况下,否则强烈不推荐使用load事件。

      最后说说ready,ready事件可以加在任意元素上,比如$(window).ready(fn);、$(document).ready(fn);、$(“div”).ready(fn);等等。

      ready事件不要求页面完全加载完,只需要加载完dom结构即可触发。

      ready事件可以同时注册多个,执行时,按照注册的先后顺序执行。注意,就算是注册不同元素的ready事件,也是按照先后顺序执行。

例如下列代码:

$(window).ready(function(){
   alert("window");
});
$(document).ready(function(){
   alert("document");
});
$("div").ready(function(){
   alert("div");
});

复制代码     按照常理,应该是div先加载完,所以先执行alert("div");,然后才是alert("document");或alert("window");,但遗憾的是,alert("div");是最后一个执行的。所以,无论是否在同一元素上注册ready事件,都是按照注册的先后顺序执行。

      最后一项,ready事件与window. onl oad=””>)是冲突的,如果使用了window. onl oad=””>),将导致ready事件不执行。 

      经过如此多的讨论,最终证明:$(document).ready(fn);兼容性、安全性是最好的,如果有此类需求,尽量采用这种方式。


js事件

window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行。

window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 

window.onload没有简化写法 
$(document).ready(function(){})可以简写成$(function(){});


不用body.Onload()理由1:

如果我们想同时加载多个函数,我们必须这样写

<body onl oad="fn1(),fn2()"></body>看起来极其丑陋,如果用$(window).load()我们可以这样加载多个函数

 $(window).load(function() {
            alert("hello,我是jQuery!");
  });
 $(window).load(function() {
        alert("hello,我也是jQuery");
 });

这样写它会从上往下执行这两个函数,并且看起来漂亮多了.

不用body.Onload()理由2:

用body.Onload()不能够做到js和html完全分离,这是一个很严重的问题.

另外用$(window).load(function(){...})和body.onload()都存在同样一个问题,因为开始也说到了,它们都需要等到页面的所有内容

加载完毕才执行,但是如果当网速比较慢的时候,加载一个页面往往需要较长的时间(几秒到十几秒不等,甚至更长...),所以我们经常

会遇到页面还没有完全加载完毕而用户已经在操作页面了这种情况,这样页面表现出来的效果就跟我们预期的效果不一样了,

所以在这里我推荐使用$(document).ready(function(){}),或简写为$(function(){}),因为他会在页面的dom元素加载完毕后就执行,




本文出自 “前端or后端” 博客,谢绝转载!

$(document).ready() 、window.onload、body.Onload()、 $(window).load、image.onload的区别