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 相关文章推荐
js不完美解决click和dblclick事件冲突问题
Jul 16 Javascript
jqgrid 表格数据导出实例
Nov 21 Javascript
jquery读取xml文件实现省市县三级联动的方法
May 29 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
May 05 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
javascript中神奇的 Date对象小结
Oct 12 Javascript
基于vue 动态加载图片src的解决方法
Feb 05 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 Javascript
js+h5 canvas实现图片验证码
Oct 11 Javascript
vue中activated的用法
Jan 03 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
关于时间计算的结总
2006/12/06 PHP
php IP及IP段进行访问限制的代码
2008/12/17 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
Laravel find in set排序实例
2019/10/09 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
Augularjs-起步详解
2016/07/08 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
python字符串替换的2种方法
2014/11/30 Python
举例讲解Python中is和id的用法
2015/04/03 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
美国Max仓库:Max Warehouse
2020/05/31 全球购物
工商技校毕业生自荐信
2013/11/15 职场文书
三方协议书范本
2014/04/22 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
博士生专家推荐信
2015/03/25 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers
mysql创建存储过程及函数详解
2021/12/04 MySQL
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL