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 相关文章推荐
你所要知道JS(DHTML)中的一些技巧
Jan 09 Javascript
javascript 复杂的嵌套环境中输出单引号和双引号
May 26 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
jQuery树形下拉菜单特效代码分享
Aug 15 Javascript
JS实现焦点图轮播效果的方法详解
Dec 19 Javascript
Node.js的特点详解
Feb 03 Javascript
js继承的这6种方式!(上)
Apr 23 Javascript
详解Vue中CSS样式穿透问题
Sep 12 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
Sep 26 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 Javascript
在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与javascript对多项选择的处理
2006/10/09 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
在javascript中关于节点内容加强
2013/04/11 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
css配合jquery美化 select
2013/11/29 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
js密码强度检测
2016/01/07 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
python代码xml转txt实例
2020/03/10 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
如何用Python徒手写线性回归
2021/01/25 Python
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
学习经验演讲稿
2014/05/10 职场文书
先进事迹演讲稿
2014/09/01 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
工程部岗位职责范本
2015/04/11 职场文书
施工现场安全管理制度
2015/08/05 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL