jQuery 源码分析笔记(4) Ready函数


Posted in Javascript onJune 02, 2011

这个功能在 jQuery的文档中提到了三种等价的形式:

// 定义在jQuery.fn.ready 
$(document).ready(handler); 
// 和上一个是同一个,不推荐 
$().ready(handler); 
// 单独在jQuery对象中处理 
$(handler); 
// 以上这个形式的定义: 
if(jQuery.isFunction(selector) { 
return rootjQuery.ready(selector); 
}

因此实际上都归结与一个形式:jQuery.fn.ready(fn)。定义如下:
ready: function(fn) { 
// 绑定事件到DOM上 
jQuery.bindReady(); 
// 触发回调函数 
readyList.done(fn); 
// 返回jQuery对象 
return this; 
}

实际上jQuery内部并不仅仅只有一个对fn的引用。这里用到了 Deferred功能。在75行,为jQuery对象定义了readyList成员。而在442行在bindReady函数中初始化了这个变量:
if(readyList) { 
return; 
} 
readyList = jQuery._Deferred();

bindReady函数除了初始化readyList之外,主要处理了浏览器对于绑定事件的区别。IE使用attachEvent而其他浏览器使用addEventHandler。这两个步骤完成后,ready函数使用readyList.resolveWith 触发回调函数。除了这个工作外,ready还处理了holdReady。这个API 的作用是延迟ready事件的回调,主要目的是在ready事件前做点事情。holdReady设置了一个标志位readyWait。当这个标志位被设置之后,ready在调用readyList.resolveWith之前不停地调用setTimeout(jQuery.ready, 1)。即每隔固定时间就递归调用自己(不知道hold时间久了,js引擎会不会栈溢出),这样最后被holdReady释放的时候, setTimeout会沿着调用栈回来的。为了在这个栈完成之前不触发ready回调函数。在每次调用setTimeout的时候,会递增readyWait变量。用来指示被holdReady函数延误了几次调用。

###几个基础辅助函数
在543行开始,定义了几个值得注意的辅助函数:parseJSON,parseXML和globalEval。parseJSON把一个字符串变成JSON对象。我们一般使用的是eval。parseJSON封装了这个操作,但是eval被当作了最后手段。因为最新JavaScript标准中加入了JSON序列化和反序列化的API。如果浏览器支持这个标准,则这两个API是在JS引擎中用Native Code实现的,效率肯定比eval高很多。目前来看,Chrome和Firefox4都支持这个API。parseJSON使用如下:

// 原生JSON API。反序列化是JSON.stringify(object) 
if(window.JSON && window.JSON.parse) { 
return window.JSON.parse(data); 
} 
// ... 大致地检查一下字符串合法性 
return (new Function("return " + data))();

parseXML函数也主要是标准API和IE的封装。标准API是DOMParser对象。而IE使用的是Microsoft.XMLDOM的 ActiveXObject对象。定义:
if(window.DOMParser) { 
tmp = new DOMParser(); 
xml = tmp.parseFromString(data, "text/xml"); 
} else { 
xml = new ActiveXObject("Microsoft.XMLDOM"); 
xml.async = "false"; 
xml.loadXML(data); 
}

globalEval函数把一段脚本加载到全局context中。IE中可以使用window.execScript。其他浏览器需要使用eval。因为整个jQuery代码都是一整个匿名函数,所以当前context是jQuery。主要代码:
(window.execScript || function(data) { 
window["eval"].call(window, data); // 在window context下运行 
})(data);
Javascript 相关文章推荐
JavaScript 验证浏览器是否支持javascript的方法小结
May 17 Javascript
js中根据字数截取字符串,不能截断url
Jan 12 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 Javascript
jQuery实现立体式数字滚动条增加效果
Dec 21 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
May 11 Javascript
node-sass安装失败的原因与解决方法
Sep 04 Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
Apr 08 Javascript
vue+layui实现select动态加载后台数据的例子
Sep 20 Javascript
浅析Vue 防抖与节流的使用
Nov 14 Javascript
jQuery treeview树形结构应用
Mar 24 jQuery
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
Jun 02 #Javascript
JqGrid web打印实现代码
May 31 #Javascript
16个最流行的JavaScript框架[推荐]
May 29 #Javascript
js 静态动态成员 and 信息的封装和隐藏
May 29 #Javascript
在JavaScript中监听IME键盘输入事件
May 29 #Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
May 28 #Javascript
Jquery css函数用法(判断标签是否拥有某属性)
May 28 #Javascript
You might like
使用php测试硬盘写入速度示例
2014/01/27 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Django框架实现的分页demo示例
2019/05/25 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
SQL中where和having的区别
2012/06/17 面试题
客服文员岗位职责
2013/11/29 职场文书
简历中求职的个人自我评价
2013/12/03 职场文书
拾金不昧的表扬信
2014/01/16 职场文书
会计自荐信范文
2014/03/09 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
班长竞选演讲稿
2014/04/24 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
音乐之声观后感
2015/06/04 职场文书
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript