你的位置:pcMing工作室 >> 资讯 >> 网页前端开发 >> JavaScript >> 详细内容 在线投稿

jQuery源码解析2(Core)

排行榜 收藏 打印 发给朋友 举报 来源: javaEye   发布者:bencode
热度149票  浏览20次 【共0条评论】【我要评论 时间:2010年5月03日 17:09
在上一篇中,我们介绍了jQuery Utilities部分的代码。 这一部分要看看Core部分的。

uo$~T0@.Puu0 

f;Y6p7?Ib-~I5C0pcMing工作室O I*y(L2S:o0Q ^

我们知道 $('#id') 或 jQuery('#id') 将会返回一个对象, 这个对象的构造函数是:jQuery.fn.init

S0ZDG8kO0

2a;b#vY~)r0 pcMing工作室.Zc5h8|M+|)N+_.v kj#d

Js代码
  1. jQuery = window.jQuery = window.$ = function( selector, context ) {   
  2.     return new jQuery.fn.init( selector, context );   
  3. },  
pcMing工作室_5hw8{6_6Pl+]_5S

 pcMing工作室CI~M-_/R

Js代码
  1. jQuery.fn.init.prototype = jQuery.fn;  

]t/j(F6Yy0 

T&x*RsoAq,P%i0

-C,s1` ]6^*qBCr0让我们先看看 jQuery.fn.initpcMing工作室:|&H!DUd1]'CmR

pcMing工作室o9nhNR R!T

 

KRBu{4W0
Js代码
  1. jQuery.fn = jQuery.prototype = {   
  2.     init: function( selector, context ) {   
  3.         selector = selector || document;  

2~0N z)?` j F^0 pcMing工作室$k7?!Re"i ]m

4v.HN)UyQ9k6Q7~"v0selector 可以指定不同的数据类型,我们一个一个来:pcMing工作室Z,YM;o)QB:ePK @

G4won/m0 pcMing工作室O y.|R8D?k}

l1Rlaz0o8LDf01.  jQuery(element);  // an html dom element

[1J2W(F.X1LQ0

2PcBf-{T0 pcMing工作室l@tT(A ZS3yO

Js代码
  1. // Handle $(DOMElement)  
  2. if ( selector.nodeType ) {   
  3.     this[0] = selector;   
  4.     this.length = 1;   
  5.     this.context = selector;   
  6.     return this;   
  7. }  
pcMing工作室 N&XVep!o#a _

 

S*JTp}t0pcMing工作室 zb:P P ?l)Fo

 所以我们可以这样使用:

jS"j`bA0pcMing工作室0dk{4i;k+X

 

1r9x.lk8B0pcMing工作室z O4b0I'Wdqe&B#^ YC

var elem = $(element); // 用于包装一个html dom元素, 以便使用jQuery操作它。

},l"\ Uw,d}`;S0

Mz OkY0 pcMing工作室l8U%Z5Tf^ w

pcMing工作室[;M;Bkv"Q

注意到以上代码,所以我们还可以像数组一样使用它:)

b Mh4[8V\$lv0

RWv*N nd[$vbM;F(S0 pcMing工作室${5N[Y5E7svY s+F

pcMing工作室_}(]f\5cA@

elem[0];// return html dom element

n,Vo:iaxh0pcMing工作室x {8~R6F ?4g*G ~]

elem.length;//pcMing工作室T AF g? QH

@'YmU Sh)?0 pcMing工作室hy&{'d[GVH

pcMing工作室!HV;?4o-O*M0},m1x

 pcMing工作室 ?$aS}Y X"R

(@0N!i^DZwIr j02. jQuery(html, [context]),  jQuery(elements, [context])pcMing工作室VD%c4}[

pcMing工作室-b8o;j{3ku8Tu

 

r.s"g ub/Q.P%n0pcMing工作室 B&G ^1P2?|

 

Eq?4M_4g0JE_0
Js代码
  1. if ( typeof selector === "string" ) {   
  2.     // Are we dealing with HTML string or an ID?  
  3.     var match = quickExpr.exec( selector );   
  4.   
  5.     // Verify a match, and that no context was specified for #id  
  6.     if ( match && (match[1] || !context) ) {   
  7.   
  8.         // HANDLE: $(html) -> $(array)  
  9.         if ( match[1] )   
  10.             selector = jQuery.clean( [ match[1] ], context );  
pcMing工作室4Q K"Hs op)[

 

|YBn;R'w(j\0pcMing工作室"s)GN1`8X

quickExpr 是一个正则式,用于匹配一个html string 或 id 字符串 (见第1篇)

4hNW5{(i E0

9R s3}_OKp3z0 

eQ(bO;yd1lX3A.K0

0e%K f7NRC0以上部分处理这样的调用:

d+P Xt$I1u)p C0pcMing工作室^d ^\?lU

 pcMing工作室/_~ q)J7sf gYX

dpD4w-Z@Yk(R0$('<div id="new-div" />')   

1zK\ vQ8g]#[.v0

+^{iNT0 

x*W-J@Z'P%hZ _0pcMing工作室,u}I\#q

稍微浏览一下jQuery.clean, 知道它解析字符串,返回 html dom 元素的数组。 pcMing工作室4B"q5Y y&R8c3o;ns

pcMing工作室C?(N+? t+xM

 

GnBQ&qw{0pcMing工作室hj(sB+n)ML;E]v

解析之后, selector 是一个 html dom 元素的数组。pcMing工作室&j%z/D&ua%pC3w

pcMing工作室 h2w}6v#|1~,D%X6]

 

7g"vR(~]7i \0

K)k A1z%fE.w0然后: pcMing工作室4mTH,`0N$AM

JWc0lE2W3em1Zd&N*m0 pcMing工作室 QT[4~'u7~+Yxt&t-h*os

Js代码
  1. return this.setArray(jQuery.isArray( selector ) ?   
  2.     selector :   
  3.     jQuery.makeArray(selector));  
pcMing工作室%EH5|W(zB*B:C R

 

2mth,Nz9~0

Wa#r#d#T)?+E"|0// setArray 马上就会分析到(因为下面用到)pcMing工作室2U%Z|2a*F.{L

N/AR,z$H2Z"A mUT0 

%RL}M:SL j\!UK)Z0pcMing工作室F W5p Nw(vd S

jQuery(elements, [context])pcMing工作室 ZBW @X f_+}

pcMing工作室 u%U7c$F_3I_1waL

 

,i@s3~@wx0pcMing工作室#mr'V o#}

这个直接调用上面的setArray。

$R z+AsT9nIP+cNU0

m#{%HP*|2S2`"I0 pcMing工作室:e/r7S`!a[g[q-C2Y1r

pcMing工作室W+v4V7@3Qa{

 pcMing工作室R5|5K8\w)Ajr"^

s*lzlz6?C}03. jQuery('#id')

(^yfa v1H-M_ S0

xi9S.|mmY0 

J2X4H4w#s!F!L](o0

qLda!@3\9s*vE A0如果是id字符串

M6vr"K0S%y:th8U$v0

5[ f9h Iv:u0 pcMing工作室X6sVZ7L Z

pcMing工作室JsJ*j/S \7d

 

#mmO.fLO0

;Ezk+?,M0e8h0

dy&]_)K0pcMing工作室EVT}z'S

pcMing工作室Ho2^;J"^5dL

y]n?Jm!s'yd0

's@S0a)n*b2_9? eX0
Js代码
  1. // HANDLE: $("#id")  
  2. else {   
  3.     var elem = document.getElementById( match[3] );   
  4.   
  5.     // Handle the case where IE and Opera return items  
  6.     // by name instead of ID  
  7.     if ( elem && elem.id != match[3] )   
  8.         return jQuery().find( selector );   
  9.   
  10.     // Otherwise, we inject the element directly into the jQuery object  
  11.     var ret = jQuery( elem || [] );   
  12.     ret.context = document;   
  13.     ret.selector = selector;   
  14.     return ret;   
  15. }  

3~7?'@gU:Z/{0 

)En8`7m Gq0pcMing工作室7^^ g m H6O

除去 IE 的 hack 部分

D:D BA7~9D4fx0

'~0d&N[.Tz$h0 pcMing工作室/b0^z1s Z6V

pcMing工作室 Wk"bxx#Z4l:e

$('#id') 相当于:

}j0^5uEM0pcMing工作室ps%t'Ns

 pcMing工作室y3lLTF!rTWR,q P n/U L

Tx(o,X/y"Yse0var dom = document.getElementById('#id');pcMing工作室x"z#M7^%ph@4l7E)U

pcMing工作室9F e0x{ Id*o0}

var elm = $(dom);
f+o[8VBS.v0elm.context = document;pcMing工作室&{2E`_;T d2y#}$n
elm.selector = '#id'';

+T&m`5A#M Vd/S-q0pcMing工作室Du tK%BO

 

A L^0t1BBm%Y2S0

\']:r2w(So D4ts0所以,使用 $('#id') 是非常快的,因为它直接调用 document.getElement 取得元素,不需要额外的解析。pcMing工作室1kL0cp6]\ B

9if$JE\0 pcMing工作室P;fCs]4Sh1R|3H

RnE%x D!fo0//---

#K5^Z4`:L1K o0pcMing工作室7`N+n4vbj

 

2z%i1h9?#c a%O0pcMing工作室{_ l$aSxp

4. jQuery(callback);

N8H[u-nx$B0

6}ry7L.f;]0 

:r'j&Co0a[Qq0

A tw`-k0 pcMing工作室cY!Z4D2wr@| Q-@2v

Js代码
  1. else if ( jQuery.isFunction( selector ) )   
  2.     return jQuery( document ).ready( selector );  
pcMing工作室.g(BefM2G5l

 pcMing工作室:YvU6a3cb;uI

]*U3z,`&dln0 

,L;Wf,S"K3_Q0
Js代码
  1. // 以下三个看喜欢选用。  
  2.   
  3. $(function() {...}) ;   
  4.   
  5. $(document).ready(function() {...});    
  6.   
  7. $().ready(function() {...});  
pcMing工作室T3m8q V!l.^IS i;L8G

 

:p G-V2o.H1@J0pcMing工作室~*~*b#`+} s9U_

 

,?TWEM`PhB0

&E2@ b!@{:O+_05. jQuery(css_selector, [context]); 

S,i;UNQ2~Q0

'V/Ye;vu0pcMing工作室0{RV0dxc2HA

pcMing工作室x[\5|)__Uz

 pcMing工作室!vw:v[c:qxn

jQVqyH9l]%U0 pcMing工作室j j6V0|7Iv g

Js代码
  1. if ( typeof selector === "string" ) {   
  2.     var match = quickExpr.exec( selector );   
  3.     if ( match && (match[1] || !context) ) {   
  4.         ...   
  5.     } else  
  6.         return jQuery( context ).find( selector );  
pcMing工作室s2aU`,H

 pcMing工作室H,v)\\4y*dAzD*O5O

~&_}7o9s VI0如果是除id 以外的 css 选择器, 那么就把这个艰巨任务的任务交给 

@3mX#Yf @%U3H!Pe0pcMing工作室Id@^^(U

 pcMing工作室Ld X~\

5r+r\~P)dg0 jQuery( context ).find( selector );

X'p!}6?@3gN._K0pcMing工作室]D`U T

pcMing工作室 Ss*lkz(W-XR

LaD-P&V,l"c0pcMing工作室D.Fc3d:HQ)RL |

 pcMing工作室*^q jij]t

K.I?MW06.  jQuery(jq)pcMing工作室S/Q[K0t7b%u3c(W!{ c

pcMing工作室#ht:UysPG%`+?3y

 pcMing工作室+b2M!f)[#H Gd

Js代码
  1. if ( selector.selector && selector.context ) {   
  2.     this.selector = selector.selector;   
  3.     this.context = selector.context;   
  4. }   
  5.   
  6. return this.setArray(jQuery.isArray( selector ) ?   
  7.     selector :   
  8.     jQuery.makeArray(selector));  
pcMing工作室u&R*R;A|-w

 pcMing工作室%F/~/H$wu$MM2m^

2p+y]8aE(O0有时候我们这样:pcMing工作室.zR([D;u/f

pcMing工作室:OI@8M`*P5F6k#I c

 pcMing工作室 ed,^9`;{VW

j*sz$A,N0var a = $('#id');

"X+|)MiB~Z0pcMing工作室 l| },h X

...

5t`3i^HT| _W"L8[x0

voH `*@w6]&c z(^0...pcMing工作室;jya1n k)?%yq(y

OFdzuo5us$Kz5@0在某一个地方pcMing工作室 f3I'lL%q`+] o

p[ Y1b:?0$(a).click(...) pcMing工作室,Rn;W!t4m7G

pcMing工作室W4a*_dEm8l0_"z

 pcMing工作室JLsm%ea$I6jq$z9{5l

pcMing工作室`.B]-V~

就是重复包装了一个jquery对象(有时候忘记了,是一个jq对象还是一个html dom)。

b#e2w)KiE z.^s:^(^0pcMing工作室+s\myx

这个速度也挺快的,因为只是进行简单的引用赋值。

-{$}.w#k@xK0pcMing工作室'y(@0E,iM cN2N \

 

*]n0G.ZUVDvW0pcMing工作室 y;qfk9T

---pcMing工作室7}K#dQ*@J

pcMing工作室W&R0b7uH0F O

setArray很简单:pcMing工作室&g2?+Q ` Mk

(e$b;Y+Sj n hD P?U5d0 

?(|#h(c.r0

0Y @(g-m6U'pRf,i0 

9P:h.QX|o0
Js代码
  1. setArray: function( elems ) {   
  2.     this.length = 0;   
  3.     Array.prototype.push.apply( this, elems );   
  4.     return this;   
  5. }  

x7Z[%EbY-@0 pcMing工作室;]x7IO%f V4O8Y

pcMing工作室i/]nzp7Z'?Q@(N

所以我们可以像使用数组一样引用jQuery中的dom元素pcMing工作室s7A{ Q-a+wE)~

pcMing工作室~'C/vl)E

pcMing工作室A'Q#e0z m5sD

1V/b7@8Bpx4l N0

TAG: jQuery jquery
顶:8 踩:9
对本文中的事件或人物打分:
当前平均分:0.16 (50次打分)
对本篇资讯内容的质量打分:
当前平均分:0.09 (44次打分)
【已经有38人表态】
9票
感动
4票
路过
5票
高兴
4票
难过
2票
搞笑
2票
愤怒
6票
无聊
6票
同情
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】

网络资源