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之可拖动的iframe效果代码
Aug 01 Javascript
javascript 隔行换色函数代码
Oct 24 Javascript
深入理解javascript中return的作用
Dec 30 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
js下将金额数字每三位一逗号分隔
Feb 19 Javascript
全面接触神奇的Bootstrap导航条实战篇
Aug 01 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
May 03 Javascript
微信jssdk踩坑之签名错误invalid signature
May 19 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
如何过滤高亮显示非法字符
2006/10/09 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
定义select的边框颜色
2008/04/28 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
采用call方式实现js继承
2014/05/20 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
原生js实现随机点名
2020/07/05 Javascript
Python可跨平台实现获取按键的方法
2015/03/05 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
Python模块搜索路径代码详解
2018/01/29 Python
自定义django admin model表单提交的例子
2019/08/23 Python
django中瀑布流写法实例代码
2019/10/14 Python
基于python监控程序是否关闭
2020/01/14 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
python中取绝对值简单方法总结
2020/07/24 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
留学推荐信写作指南
2014/01/25 职场文书
企业申诉管理制度
2014/01/30 职场文书
教师师德反思材料
2014/02/15 职场文书
奠基仪式主持词
2014/03/20 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
中班下学期个人总结
2015/02/12 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP