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 相关文章推荐
jquery固定底网站底部菜单效果
Aug 13 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
Jun 30 Javascript
JS倒计时代码汇总
Nov 25 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
Aug 28 Javascript
javascript中call apply 与 bind方法详解
Mar 10 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 Javascript
PHP实现本地图片上传和验证功能
Feb 27 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
vue v-model实现自定义样式多选与单选功能
Jul 05 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
Sep 12 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
Oct 23 Javascript
js实现随机点名
Jan 19 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+ajax导入大数据时产生的问题处理
2014/06/11 PHP
在UpdatePanel内jquery easyui效果失效的解决方法
2010/04/11 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
Python 爬虫图片简单实现
2017/06/01 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
毕业生个人求职的自我评价
2013/10/28 职场文书
行政专员工作职责
2013/12/22 职场文书
初中政治教学反思
2014/01/17 职场文书
公司年底活动方案
2014/08/17 职场文书
甲午风云观后感
2015/06/02 职场文书
鸦片战争观后感
2015/06/09 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server