1/*2*说明:3*本源代码的中文注释乃Auscarlin呕心沥血所作.旨在促进jQuery的传播以及向广大jQuery爱好者提供一个进阶4*的途径,以让各位更加深入地了解jQuery,学习其中有用的技术,从而为振兴中华JS出一份绵薄之力...(说大了...)5*6*本文件保留了jQuery代码原来的英文注释,个别语句我在其旁列出了尝试性的翻译(并标明这是翻译).水平有限希望读者能斟酌.7*另外,本中文注释不是简单将原文翻译(jQuery作者那少得可怜的注释根本不足以让我们读通jQuery的源代码).8*而是尽本人最大的努力将程序的意图以及所涉及的中高级的JavaScript程序设计技术展现给各位读者,故文件注释较为详尽.9*10*在注释的书写风格方面,采取了比较随意的方式和语气,目的在于避免晦涩的说教以及拉近读者与代码之间的距离,同时也是为了11*增强大家在阅读代码的趣味性.另外,本人并不提倡使用中文进行注释,但是为了扩大读者群体,不得已为之...12*13*见识肤浅,不足之处希望指出.我也希望有人能理解与支持我的工作.如果你觉得我的注释对你有帮助,请不要吝惜你的感谢~14*批评与鼓励还有建议都可以通过以下这个电子邮件地址发送给我:15*auscar@126.com16*17*或者登录我的个人网站给我留言:18*(注:linhuihua是我的中文名拼音)19*20*又另外,本人写的仿jQueryjs框架miniQ即将要跟大家见面.21*这个框架比jQuery短小,功能也没有这么强大.但它的架构完全仿照jQuery.可以说它是jQuery架构的一个DEMO.22*透过它,你可以从整体上把握jQuery的框架以及所用到的程序技巧和设计模式.可以说它是一个教学用的小框架.23*24*希望能有越来越多的人喜欢上jQuery,享受jQuery!25*26*/27/*28*版权声明:29*(1)本文件中的JavaScript代码与英文注释版权归原作者所有30*(2)本文件中的中文注释版权归本人所有.请自由下载与传播本文件,但请勿用于商业用途.31*/3233/*34*jQuery1.2.6-NewWaveJavascript35*36*Copyright(c)2008JohnResig(jquery.com)37*DuallicensedundertheMIT(MIT-LICENSE.txt)38*andGPL(GPL-LICENSE.txt)licenses.39*40*$Date:2008-05-2414:22:17-0400(Sat,24May2008)$41*$Rev:5685$-1-42*/434445/*46*整个jQuery代码都定义在一个自运行(定义完成之后马上运行)的匿名函数的内部:47*(function(){48*49*//jQuerycoderunshere50*51*})();52*53*这样,这个匿名函数所形成的闭包会保护jQuery的代码,避免了匿名函数内部的jQuery代码与外部之间发生冲突(如使用了相同的变量名).54*另外,函数自运行也保证了jQuery在能在第一时间得到初始化.55*/56(function(){57/*58*写下面两行代码,是出于这样的考虑:59*在多库共存的环境中,很可能会与别人的库使用相同的关键字,那就先把人家的jQuery、$(如果真的有人用的话)保存下来,60*然后再换上自己的。需要的时候再把自己的jQuery,$关键字卸掉,恢复人家的代码对这个两个关键字的使用权.调用jQuery.noConflict便可恢复.61*恢复的详细内容,请参考jQuery.noConflict的中文注释.62*/63//MapoverjQueryincaseofoverwrite64//保存jQuery的关键字,免得被重写后没法恢复.65var_jQuery=window.jQuery,66//Mapoverthe$incaseofoverwrite67//保存$的关键字,免得被重写后没法恢复.68_$=window.$;697071/*当前作用域内(也就是这个自运行的匿名函数所形成的闭包内)、全局作用域内中的jQuery和$都是注释下面的这个函数的引用.72*而这个函数实际上是调用jQuery.fn.init来构造一个jQuery对象.73*使用jQuery的人可能会奇怪:为什么我直接使用$('#someId')就能选择到我要的对象?怎么$就可以用啦?$到底是什么意思?这里的代码就能给出一点答案:74*原来$不过是一个jQuery构造函数的引用.使用$()就是调用了下面这个函数.75*/76/**77*jQuery的构造函数.通过selector选择器构造并返回一个jQuery对象.78*@param{string}selector79*@param{Object}context80*/81varjQuery=window.jQuery=window.$=function(selector,context){82//ThejQueryobjectisactuallyjusttheinitconstructor'enhanced'83/*84*实际上,jQuery.fn.init才是jQuery真正的构造函数.这里就是jQuery美妙世界的入口.85*/-2-86returnnewjQuery.fn.init(selector,context);87};8889//AsimplewaytocheckforHTMLstringsorIDstrings90//(bothofwhichweoptimizefor)91/*翻译:一个检测HTML字符串和ID字符串的简单方法.92*说明:93*以下是一个正则表达式,意在快速地检测字符串是不是HTMLstringorIDstring94*/95varquickExpr=/^[^]*((.|\s)+)[^]*$|^#(\w+)$/,9697//Isitasimpleselector98//isSimple是一个简单选择器的正则表达式.简单是说选择器字符串里面只有一个选择器,如:99//'#eleID'就是一个简单的选择器,而:100//'#eleID.address'则是一个复杂(complex)选择器101isSimple=/^.[^:#\[\.]*$/,102103//Willspeedupreferencestoundefined,andallowsmungingitsname.104undefined;105/*106*我要对以上这个undefined进行解释:107*ECMAScriptv3的规范里面规定了名为undefined的全局变量,它的初始值就是undefined.108*但是我们并不确定世界上的任何一个JavaScript实现都有全局变量undefined,那么这时我们109*只需要自己声明一个但不给它赋值即可,它的值就是undefined.110*111*上面那个undefined就是声明了这样的一个变量.112*113*/114115/*116*下面的对通过jQuery.prototype的定义来规划jQuery对象的主要行为.所有通过构造函数(如jQuery,$)new出来的jQuery对象都继承来自jQuery.prototype117*的属性和方法.注意jQuery.prototype使用了另外一个别名:jQuery.fn.在jQuery的代码当中,使用jQuery.fn来代替jQuery.prototype,其实是一样的.118*/119jQuery.fn=jQuery.prototype={120/**121*jQuery的初始化函数.每次new一个jQuery对象的时候,总是首先由这个函数实现初始化.122*初始化的主要工作是根据选择器selector选择到匹配的元素,并将这些元素放入一个jQuery称之为matchedelementset的集合当中,最后返回这个jQuery对象.123*注意,jQuery对象并没有实实在在的一个matchedelementset属性.假设我们的新定义了一个jQuery对象:124*varjq=newjQuery('a');125*那么页面上的所有a标签元素就会以jq[0],jq[1],jq[2]...,jq[n]的形式存储到jQuery对象(即jq)当中.jQuery把这些匹配到的元素在逻辑上看作是一个126*集合,并称之为matchedelementset.127*128*@param{string}selector-选择器.-3-以这个字符串指定需要选择的元素.129*@param{Object}context-选择器的上下文.即指明要在一个什么范围之内选择seletor所指定的元素.130*/131init:function(selector,context){132//Makesurethataselectionwasprovided133//如果没有传入selector,那么docuemnt就会成为默认的selector.没有selector就用document来凑数.让matchedelementset里面至少要134//有一个元素.135selector=selector||document;136137/*138*下面要对selecotr对象进行进行分类的检查,不同类型,不同的处理.139*selector可能的类型如下:140*(1)直接的一个Dom元素类型141*(2)数组类型142*(3)函数(function)类型143*(4)jQuery或者其他的类数组对象类型144*(5)string类型145*a)没有context的情况146*b)有context的情况147*/148149/*好了,现在就分情况进行处理*/150151//Handle$(DOMElement)152//是不是(1)直接的一个Dom元素类型啊?如果是,就将这个Dom元素直接放入jQuery对象的[0]属性中,设置匹配元素集合的大小为1,返回153if(selector.nodeType){//是Dom元素就应该有一个nodeType154this[0]=selector;155this.length=1;156returnthis;157}158159//HandleHTMLstrings160//是不是类型(5)-string类型?161if(typeofselector==string){162//ArewedealingwithHTMLstringoranID?163//翻译:我们是否正在处理HTML或者ID字符串?164varmatch=quickExpr.exec(selector);165166/*167*通过match变量来将string类型的情况再区分成两类:168*(1)是HTML字符串或者ID字符串的情况169*(2)其他,如'.className','tagName'之类.170*/171172//Verifyamatch,andthatnocontextwasspecifiedfor#id173//核对这个匹配,还有那些没有为#id提供context的情况.174if(match&&(match[1]||!context)){175176//HANDLE:$(html)-$(array)177//如果传入的是HTML:178//那么调用jQuery.clean将字符串转化成真正的DOM元素然后装在一个数组里面,最后返回给selector-4-179//这样selector最后将变成了(2)类型.180if(match[1])181selector=jQuery.clean([match[1]],context);//clean的作用就是将传入的HTMLstring转化成为DOM182//元素