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 相关文章推荐
JavaScript 选中文字并响应获取的实现代码
Aug 28 Javascript
Jquery实现搜索框提示功能示例代码
Aug 13 Javascript
Jquery获取元素的父容器对象示例代码
Feb 10 Javascript
jquery增加和删除元素的方法
Jan 14 Javascript
JavaScript模版引擎的基本实现方法浅析
Feb 15 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
js本地图片预览实现代码
Oct 09 Javascript
JS常用算法实现代码
Nov 14 Javascript
jQuery鼠标悬停内容动画切换效果
Apr 27 jQuery
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 jQuery
ElementUI多个子组件表单的校验管理实现
Nov 07 Javascript
详解如何修改 node_modules 里的文件
May 22 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权重计算方法代码分享
2014/01/09 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python之wxPython应用实例
2014/09/28 Python
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
Python实现读取json文件到excel表
2017/11/18 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
教育科研先进个人材料
2014/01/26 职场文书
餐厅考勤管理制度
2014/01/28 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
护理专业自荐书
2014/06/04 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
全陪导游词开场白
2015/05/29 职场文书
总结会主持词
2015/07/02 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书