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的一个拖拽到指定区域内的效果
Sep 21 Javascript
Javascript 高阶函数使用介绍
Jun 15 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
js接收并转化Java中的数组对象的方法
Aug 11 Javascript
AngularJS中isolate scope的用法分析
Nov 22 Javascript
jQuery代码优化方法总结
Jan 29 jQuery
vuejs使用axios异步访问时用get和post的实例讲解
Aug 09 Javascript
一次Webpack配置文件的分离实战记录
Nov 30 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
May 03 Javascript
node.js Promise对象的使用方法实例分析
Dec 26 Javascript
Vue自定义render统一项目组弹框功能
Jun 07 Javascript
javascript使用canvas实现饼状图效果
Sep 08 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 获取SWF动画截图示例代码
2014/02/10 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
javascript 日期时间 转换的方法
2013/02/21 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python转码问题的解决方法
2008/10/07 Python
在Python中处理时间之clock()方法的使用
2015/05/22 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
TensorFlow的权值更新方法
2018/06/14 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
python中reload重载实例用法
2020/12/15 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
爱我中华演讲稿
2014/05/20 职场文书
网站推广策划方案
2014/06/04 职场文书
入党转正介绍人意见
2015/06/03 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
nginx之内存池的实现
2022/06/28 Servers