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实现长文字部分显示代码
May 13 Javascript
node.js中的fs.unlink方法使用说明
Dec 15 Javascript
Javascript中的arguments与重载介绍
Mar 15 Javascript
深入浅析JavaScript中对事件的三种监听方式
Sep 29 Javascript
理解Angular数据双向绑定
Jan 10 Javascript
vue数据双向绑定原理解析(get &amp; set)
Mar 08 Javascript
JavaScript实现左右下拉框动态增删示例
Mar 09 Javascript
Vue动态实现评分效果
May 24 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
May 06 Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 Javascript
JavaScript中10个Reduce常用场景技巧
Jun 21 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 页面执行时间计算代码
2008/12/04 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
Js动态创建div
2008/09/25 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
js实现消息滚动效果
2017/01/18 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
Python3模拟登录操作实例分析
2019/03/12 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
python新手学习使用库
2020/06/11 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
美国在线工具商店:Acme Tools
2018/06/26 全球购物
上学迟到的检讨书
2014/01/11 职场文书
奶茶店创业计划书范文
2014/01/17 职场文书
西式结婚主持词
2014/03/14 职场文书
遗嘱继承公证书
2014/04/09 职场文书
不同意离婚答辩状
2015/05/22 职场文书
二胎满月酒致辞
2015/07/29 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS