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


这个功能在 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 三种数组复制方法的性能对比
让白领爱上Windows7的七个理由
在SQL中使用convert函数进行日期的查询
php设计模式介绍之值对象模式
基于C# 网站地图制作
dede文章列表页调用TAG标签
CSS框架的利与弊(下)
CSS3教程(7):CSS3嵌入字体
一个简单计数器的源代码
XP折叠菜单&仿QQ2006菜单
Linux中的一个守护进程实验
JavaScript中判断函数是new还是()调用的区别说明
SSIS中的字符映射表转换组件
中科红旗Linux桌面7.0版引入QtSDK组件
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 读祖国在我心中有感作文400字 中秋月,中华情 2016柜台加工合同范本 打开心灵的那扇窗作文600字 上学 小记者来到福利院 芦花似雪舞秋声 沸冰煮茶 冥想的好处及功效 小学六年级作文550字:新年打雪仗 一个动作充满爱作文550字 小学四年级作文800字:爸爸,请听我说…… 区建设局年度执法监察工作总结及工作计划 班级管理理念 没有、结果 政府道路交通安全管理工作讲话 小学三年级作文550字:可爱的山羊 “安全生产月”宣传标语内容 “我说我家”教学实录及点评 六一儿童节毕业生致辞 我开心的一天 学生会主席团成员竞选演讲稿 《悼念玛丽 世界首富:少年壮志不言愁 在欺骗中绝望作文1900字 我决定相信你。 关于爸爸,我想对你说作文250字 白色小盒子 高中高二作文900字:生命中的树 【我最讨厌听到的13句话,你有木有同感?】 落花痕 虎子作文150字 鸟图腾 放心消费区域创建工作总结 六年级试卷:六年级阅读训练材料 校园里美好的童年生活作文400字 冬·雨 ?姑妈的一封信 党委组织部年度工作总结 鼠目寸光的意思_鼠目寸光的反义词 “酒鬼”老爸400字 满江红(贺项平甫起复知鄂渚) 爱运动作文700字 我守卫在心爱的牧场 望 乡 冬,来得快又慢作文350字 缱心与素魅的芳华,相忘与遥远的江湖 孤独的小孩作文100字 妄求作文700字 法学专业大学生社会实践心得体会

Copyright © 2016 phpStudy |