jQuery中document与window以及load与ready 区别详解


Posted in Javascript onDecember 29, 2014

用过JavaScript的童鞋,应该知道window对象和document对象,也应该听说过load事件和ready事件,小菜当然也知道,而且自认为很了解,直到最近出了问题,才知道事情并不是那么简单。

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

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

jQuery中document与window以及load与ready 区别详解

再说说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.onload(或<body onload=””>)是冲突的,如果使用了window.onload(或<body onload=””>),将导致ready事件不执行。

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

Javascript 相关文章推荐
基于jquery的实现简单的表格中增加或删除下一行
Aug 01 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
Nov 07 Javascript
JavaScript面向对象之私有静态变量实例分析
Jan 14 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
AngularJs Understanding the Controller Component
Sep 02 Javascript
基于vue的验证码组件的示例代码
Jan 22 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
layui关闭层级、简单监听的实例
Sep 06 Javascript
构建Vue大型应用的10个最佳实践(小结)
Nov 07 Javascript
jQuery中:header选择器用法实例
Dec 29 #Javascript
JavaScript实现查找字符串中第一个不重复的字符
Dec 29 #Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
Dec 29 #Javascript
JavaScript中的数学运算介绍
Dec 29 #Javascript
jQuery中:lt选择器用法实例
Dec 29 #Javascript
JavaScript中的数值范围介绍
Dec 29 #Javascript
JavaScript常用小技巧小结
Dec 29 #Javascript
You might like
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
JavaScript的Cookies
2008/01/16 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
10道典型的JavaScript面试题
2017/03/22 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
python调用fortran模块
2016/04/08 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python3中使用PyMongo的方法详解
2017/07/28 Python
Python中一些深不见底的“坑”
2019/06/12 Python
Django模板语言 Tags使用详解
2019/09/09 Python
python重要函数eval多种用法解析
2020/01/14 Python
军训自我鉴定范文
2014/02/13 职场文书
民族精神月活动总结
2014/08/28 职场文书
2014司机年终工作总结
2014/12/05 职场文书
九华山导游词
2015/02/03 职场文书
大明湖导游词
2015/02/03 职场文书
小学生读书笔记范文
2015/06/30 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书