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 写类方式之七
Jul 05 Javascript
MooTools 1.2介绍
Sep 14 Javascript
海量经典的jQuery插件集合
Jan 12 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
May 11 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
getElementById().innerHTML与getElementById().value的区别
Oct 27 Javascript
jQuery实现限制文本框的输入长度
Jan 11 Javascript
Vue框架中正确引入JS库的方法介绍
Jul 30 Javascript
JavaScript中的 new 命令
May 22 Javascript
javascript运行机制之执行顺序理解
Aug 03 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
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
在Django框架中编写Contact表单的教程
2015/07/17 Python
PyQT实现多窗口切换
2018/04/20 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
婴儿地球:Baby Earth
2018/12/25 全球购物
餐饮采购员岗位职责
2014/03/15 职场文书
项目建议书范文
2014/05/12 职场文书
计算机软件专业求职信
2014/06/10 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
购房委托书范本
2014/09/18 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
导师对论文的学术评语
2015/01/04 职场文书
见习期个人总结
2015/03/05 职场文书