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 仿腾讯发表微博的效果代码
Dec 25 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
Dec 27 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
Jan 20 Javascript
JavaScript将字符串转换成字符编码列表的方法
Mar 19 Javascript
JS如何生成一个不重复的ID的函数
Dec 25 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
mui框架 页面无法滚动的解决方法(推荐)
Jan 25 Javascript
详解vue添加删除元素的方法
Jun 30 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
微信小程序实现下拉刷新动画
Jun 21 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
Sep 21 Javascript
Vue实现移动端拖拽交换位置
Jul 29 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微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
繁简字转换功能
2006/07/19 Javascript
jquery中常用的SET和GET
2009/01/13 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
对python生成业务报表的实例详解
2019/02/03 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
pandas针对excel处理的实现
2021/01/15 Python
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
财务管理职业生涯规划范文
2013/12/27 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
小学课外活动总结
2014/07/09 职场文书
毕业生找工作求职信
2014/08/05 职场文书
雷峰塔导游词
2015/02/09 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
小程序自定义轮播图圆点组件
2022/06/25 Javascript
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技