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基本类型详解
Nov 28 Javascript
原生js结合html5制作简易的双色子游戏
Mar 30 Javascript
js实现同一个页面多个渐变效果的方法
Apr 10 Javascript
JQuery+CSS实现图片上放置按钮的方法
May 29 Javascript
谈谈impress.js初步理解
Sep 09 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
Dec 02 Javascript
总结Node.js中的一些错误类型
Aug 15 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
Dec 29 Javascript
Vue渲染函数详解
Sep 15 Javascript
javascript变量提升和闭包理解
Mar 12 Javascript
vue项目中引入Sass实例方法
Aug 27 Javascript
linux服务器快速卸载安装node环境(简单上手)
Feb 22 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
Apache设置虚拟WEB
2006/10/09 PHP
php中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
实例讲解Python3中abs()函数
2019/02/19 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
商务会议邀请函
2014/01/09 职场文书
竞聘演讲稿范文
2014/01/12 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
小学生思想品德评语
2014/12/31 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang