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 相关文章推荐
javascript模仿msgbox提示效果代码
Jun 10 Javascript
JS格式化数字金额用逗号隔开保留两位小数
Oct 18 Javascript
浅析Javascript中“==”与“===”的区别
Dec 23 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
Apr 01 Javascript
jQuery实现表格行上下移动和置顶效果
Jun 05 Javascript
javascript创建对象的3种方法
Nov 02 Javascript
详解vue-router2.0动态路由获取参数
Jun 14 Javascript
jQuery实现的简单获取索引功能示例
Jun 04 jQuery
Vue实例的对象参数options的几个常用选项详解
Nov 08 Javascript
javascript实现滚轮轮播图片
Dec 13 Javascript
关于vue中如何监听数组变化
Apr 28 Vue.js
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下将XML转换为数组
2010/01/01 PHP
php常用图片处理类
2016/03/16 PHP
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
python中Flask框架简单入门实例
2015/03/21 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
Python使用剪切板的方法
2017/06/06 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
python树的同构学习笔记
2019/09/14 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
空乘英文求职信
2014/04/13 职场文书
企业安全生产标语
2014/06/06 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
碧霞祠导游词
2015/02/09 职场文书
慰问信格式规范
2015/03/23 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
Android中View.post和Handler.post的关系
2022/06/05 Java/Android