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 判断浏览器类型及版本
Feb 21 Javascript
javascript function调用时的参数检测常用办法
Feb 26 Javascript
xml文档转换工具,附图表例子(hta)
Nov 17 Javascript
鼠标移动到图片名上,显示图片的简单实例
Jul 14 Javascript
js函数模拟显示桌面.scf程序示例
Apr 20 Javascript
angularjs的一些优化小技巧
Dec 06 Javascript
JQuery简单实现锚点链接的平滑滚动
May 03 Javascript
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 Javascript
微信小程序使用wxParse解析html的实现示例
Aug 30 Javascript
自定义Vue中的v-module双向绑定的实现
Apr 17 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
Mar 26 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
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构造函数实例讲解
2013/11/13 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
js中的前绑定和后绑定详解
2013/08/01 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
vuex入门最详细整理
2020/03/04 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
python 实现识别图片上的数字
2019/07/30 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
Java程序员常见面试题
2015/07/16 面试题
幼儿园运动会加油词
2014/02/14 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
社区服务活动小结
2014/07/08 职场文书
优秀班组事迹材料
2014/12/24 职场文书
先进党组织事迹材料
2014/12/26 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
地球一小时活动总结
2015/02/27 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
使用JS实现简易计算器
2021/06/14 Javascript
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python