jQuery 源码分析和Ready函数
这个功能在 jQuery的文档中提到了三种等价的形式:
复制代码 代码如下:
// 定义在y
$(document)y(handler);
// 和上一个是同一个,不推荐
$()y(handler);
// 单独在jQuery对象中处理
$(handler);
// 以上这个形式的定义:
if(nction(selector) {
return y(selector);
}
因此实际上都归结与一个形式:y(fn)。定义如下:
复制代码 代码如下:
ready: function(fn) {
// 绑定事件到DOM上
Ready();
// 触发回调函数
(fn);
// 返回jQuery对象
return this;
}
实际上jQuery内部并不仅仅只有一个对fn的引用。这里用到了 Deferred功能。在75行,为jQuery对象定义了readyList成员。而在442行在bindReady函数中初始化了这个变量:
复制代码 代码如下:
if(readyList) {
return;
}
readyList = jQuery._Deferred();
bindReady函数除了初始化readyList之外,主要处理了浏览器对于绑定事件的区别。IE使用attachEvent而其他浏览器使用addEventHandler。这两个步骤完成后,ready函数使用lveWith 触发回调函数。除了这个工作外,ready还处理了holdReady。这个API 的`作用是延迟ready事件的回调,主要目的是在ready事件前做点事情。holdReady设置了一个标志位readyWait。当这个标志位被设置之后,ready在调用lveWith之前不停地调用setTimeout(y, 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( && e) {
return e(data);
}
// ... 大致地检查一下字符串合法性
return (new Function("return " + data))();
parseXML函数也主要是标准API和IE的封装。标准API是DOMParser对象。而IE使用的是OM的 ActiveXObject对象。定义:
复制代码 代码如下:
if(arser) {
tmp = new DOMParser();
xml = eFromString(data, "text/xml");
} else {
xml = new ActiveXObject("OM");
c = "false";
XML(data);
}
globalEval函数把一段脚本加载到全局context中。IE中可以使用Script。其他浏览器需要使用eval。因为整个jQuery代码都是一整个匿名函数,所以当前context是jQuery。主要代码:
复制代码 代码如下:
(Script || function(data) {
window["eval"](window, data); // 在window context下运行
})(data);
-
JavaScript经典效果集锦
些很实用且必用的小脚本代码:脚本1:进入主页以后自动播放声音脚本2:进入主页后自动最大话,省的去在自己单击了To(0,0)zeTo(lWidth,lHeight)脚本3:显示现在时间的脚本enow脚本4:显示最后修改时间的.脚本e(Modified)脚本5:设为首页,加为收藏,加入频道,启动outlook...
-
JavaScript插件化开发方式
一,开篇分析今天这篇文章我们说点什么那?嘿嘿嘿。我们接着上篇文章对不足的地方进行重构,以深入浅出的方式来逐步分析,让大家有一个循序渐进提高的过程。废话少说,进入正题。让我们先来回顾一下之前的Js部分的代码,如下:复制代码代码如下:functionItemSelector(elem,o...
-
ASP.NET新型的投票结果显示方法
一个投票功能模块少不了查看投票结果,用进度条显示各个投票结果可以起到一目了然的效果。以下是我的方法,请大家不吝赐教:1:做一张图片用于做进度条,只需要很小的一个图片就可以了,如高20px,宽1px。2:在要显示进度条的单元格中插入image控件,其imageUrl设置为已做好的...
-
如何理解Javascript的caller,callee,call,apply区别
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:argumentsarguments该对象代表正在执行的函数和调用它的函数的参数。[function.]arguments[n]参数function:选项。当前正在执行的Function对象的名字。n:选项。要传递给Function对象的从0开始的参数值...