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中style属性
Oct 11 Javascript
Javascript 网页水印(非图片水印)实现代码
Mar 01 Javascript
c#和Javascript操作同一json对象的实现代码
Jan 17 Javascript
基于jquery的用鼠标画出可移动的div
Sep 06 Javascript
javascript 获取函数形参个数
Jul 31 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
Jun 10 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 Javascript
vue自定义指令directive实例详解
Jan 17 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
element el-input directive数字进行控制
Oct 11 Javascript
微信小程序入口场景的问题集合与相关解决方法
Jun 26 Javascript
vue-cli4使用全局less文件中的变量配置操作
Oct 21 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的历史和优缺点
2006/10/09 PHP
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
两个开源的Php输出Excel文件类
2010/02/08 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php编写简单的文章发布程序
2015/06/18 PHP
php中session定期自动清理的方法
2015/11/12 PHP
php英文单词统计器
2016/06/23 PHP
jQuery参数列表集合
2011/04/06 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
JavaScript类的写法
2016/09/17 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
js构造函数创建对象是否加new问题
2018/01/22 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
python列表list保留顺序去重的实例
2018/12/14 Python
python实现感知器算法(批处理)
2019/01/18 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
生产部主管岗位职责
2014/01/06 职场文书
知识竞赛活动方案
2014/02/18 职场文书
教育技术职业规划范文
2014/03/04 职场文书
租车协议书范本
2014/04/22 职场文书
节约粮食标语
2014/06/18 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书