1.å
³äºjQuery 代ç ç书åå½¢å¼
2.jQuery内部原理和实现方式浅析
å ³äºjQuery 代ç ç书åå½¢å¼
1ãå®ä¹jQueryåéçæ¶åæ·»å varå ³é®åããè¿ä¸ªä¸ä» ä» æ¯jQueryï¼ææjavascriptå¼åè¿ç¨ä¸ï¼é½éè¦æ³¨æï¼ä¸è¦å®ä¹æå¦ä¸ï¼
$loading = $('#loading'); //è¿ä¸ªæ¯å ¨å±å®ä¹2ã使ç¨ä¸ä¸ªvaræ¥å®ä¹åé
ããå¦æ使ç¨å¤ä¸ªåéçè¯ï¼å¦ä¸æ¹å¼å®ä¹ï¼
var page = 0,源码$loading = $('#loading'),
$body = $('body');
ä¸è¦ç»æ¯ä¸ä¸ªåéé½æ·»å ä¸ä¸ªvarå ³é®å
3ãå®ä¹jQueryåé
ããç³ææè å®ä¹åéçæ¶åï¼è¯·è®°ä½å¦æå®ä¹çæ¯jQueryçåéï¼æ·»å ä¸ä¸ª$符å·å°åéåï¼å¦ä¸ï¼
var$loading = $('#loading');è¿éå®ä¹æè¿æ ·ç好å¤å¨äºï¼ å¯ä»¥ææçæ示èªå·±æè å ¶å®é 读 代ç çç¨æ·ï¼è¿æ¯ä¸ä¸ªjQueryçåé
4ãDOMæä½è¯·å¡å¿ è®°ä½ç¼åï¼cacheï¼
å¨jQuery代ç å¼åä¸ï¼å¸¸å¸¸éè¦æä½DOMï¼DOMæä½æ¯é常æ¶èèµæºçä¸ä¸ªè¿ç¨ï¼èå¾å¾å¾å¤äººé½å欢è¿æ ·ä½¿ç¨jQueryï¼
$('#loading').html('å®æ¯');$('#loading').fadeOut();
代ç 没æä»»ä½é®é¢ï¼ ä¹å¯ä»¥æ£å¸¸è¿è¡åºç»æï¼ä½æ¯è¿é注æ æ¯æ¬¡å®ä¹å¹¶ä¸è°ç¨$('#loading')çæ¶åï¼é½å®é å建äºä¸ä¸ªæ°çåéï¼å¦æ éè¦éç¨çè¯ï¼è®°ä½ä¸å®è¦å®ä¹å°ä¸ä¸ªåééï¼è¿æ ·å¯ä»¥ææçç¼ååéå 容ï¼å¦ä¸ï¼
var $loading = $('#loading');$loading.html('å®æ¯');$loading.fadeOut();
è¿æ ·æ§è½ä¼æ´å¥½ã
5ã使ç¨é¾å¼æä½
ããä¸é¢é£ä¸ªä¾åï¼å¯ä»¥åçæ´ç®æ´ä¸äºï¼
var $loading = $('#loading');$loading.html('å®æ¯').fadeOut();
6ãç²¾ç®jQuery代ç
ããå°½éæ代ç é½æ´åå°ä¸èµ·ï¼è¯·å¿è¿æ ·ç¼ç ï¼
// ï¼ï¼åé¢äººç©$button.click(function(){$target.css('width','%');
$target.css('border','1px solid #');
$target.css('color','#fff');
});
åºè¯¥è¿æ ·ä¹¦åï¼
$button.click(function(){$target.css({ 'width':'%','border':'1px solid #','color':'#fff'});
});
7ãé¿å 使ç¨å ¨å±ç±»åçéæ©å¨
ãã请å¿å¦ä¸æ¹å¼ä¹¦åï¼ãã $('.something > *');
ããè¿æ ·ä¹¦åæ´å¥½ï¼
ãã $('.something').children();
8ãä¸è¦å å å¤ä¸ªID
ãã请å¿å¦ä¸ä¹¦åï¼ãã $('#something #children');
ããè¿æ ·ä¹¦åæ´å¥½ï¼
ãã $('#children');
9ãå¤ç¨é»è¾å¤æ||æè &&æ¥æé
ã
ã请å¿å¦ä¸ä¹¦åï¼if(!$something) {
$something = $('#something ');
}
ããè¿æ ·ä¹¦åæ§è½æ´å¥½ï¼
$something= $something|| $('#something');
ãå°½é使ç¨æ´å°ç代ç
ãã
ä¸å ¶è¿æ ·ä¹¦åï¼if(string.length > 0){ ..}ããä¸å¦è¿æ ·ä¹¦åï¼if(string.length){ ..}
ãå°½éä½¿ç¨ .onæ¹æ³
ããå¦æ 使ç¨æ¯è¾æ°çæ¬çjQueryç±»åºçè¯ï¼è¯·ä½¿ç¨.onï¼å ¶å®ä»»ä½æ¹æ³é½æ¯æç»ä½¿ç¨.onæ¥å®ç°ç
ãå°½é使ç¨ææ°çæ¬çjQuery
ããææ°çæ¬çjQueryæ¥ææ´å¥½çæ§è½ï¼ä½æ¯ææ°ççæ¬å¯è½ä¸æ¯æie6/7/8ï¼æ以大家éè¦èªå·±é对å®é æ åµéæ©
ãå°½é使ç¨åççJavascript
ããå¦æ使ç¨åççJavascriptä¹å¯ä»¥å®ç°jQueryæä¾çåè½çè¯ï¼æ¨è使ç¨åççjavascriptæ¥å®ç°
jQuery内部原理和实现方式浅析
这段时间在学习研究jQuery源码,受益于jQuery日益发展强大,注释研究jQuery的源码大牛越来越多,学习的注释微信号网源码资料也比前两年好找了,有很多非常不错的源码资源,如高云的注释jQuery1.6.1源码分析系列。这些教程非常细致的源码分析了jQuery内部原理和实现方式,对学习和理解jQuery有非常大的注释帮助。但是源码个人认为很多教程对jQuery的整体结果把握不足,本人试图从整体来阐述一下jQuery的注释内部实现。
大家知道,源码地狱边境游戏源码调用jQuery有两种方式,注释一种是源码高级的实现,通过传递一个参数实现DOM选择,注释如通过$(“h1″)选择所有的源码h1元素,第二种是jieba词性标注源码较为低级的实现,如果通过$.ajax实现ajax的操作。那么,这两种方式到底有何不同?用typeof函数检测$(‘h1′)和$.ajax,类型分别为object和function,稍微学过jQuery的都知道或者听过过,前者返回的html手机显示源码是一个jQuery对象,那么jQuery对象是什么,它和jQuery是什么关系呢?我们先来通过for(var
i
in
$(”))
document.write(i+”
:::”+$(“”)[i]+””);打印一下jQuery对象的属性和对应的值,可以看到它有多个属性,通过console输入$(“*”)可以看到大部分属性是继承自jQuery原型的属性,jQuery对象实际上是这样一个对象:
所以我们来推测,jQuery的乡聊app源码实现可能是类似这样的:
function
jQuery(){
this[0]="Some
DOM
Element";
this[1]="Some
DOM
Element";
this[2]="Some
DOM
Element";
this.length=3;
this.prevObject="Some
Object";
this.context="Some
Object";
this.selector="Some
selector";
}
jQuery.prototype={
get:function(){ },
each:function(){ },
......
}
这些代码通过new操作符就就能创建出拥有上述属性的jQuery对象,但是实际上我们调用jQuery创建jQuery对象时并没有使用new操作符,这是如何实现的呢?来看jQuery的实现:
var
jQuery
=
function(
selector,
context
)
{
//
The
jQuery
object
is
actually
just
the
init
constructor
'enhanced'
return
new
jQuery.fn.init(
selector,
context,
rootjQuery
);
}
jQuery.fn=jQuery.prototype={
jquery:
core_version,
init:function(selector,context){
//some
code
return
this;
}
//some
code
there
//......
}
jQuery.fn.init.prototype=jQuery.fn;
这里有几点做得非常巧妙的地方,第一点是通过jQuery原型属性的init方法来创建对象来达到不用new创建对象的目的,第二点是对init方法内this指向的处理。我们知道,通过调用init返回一个jQuery的实例,那么这个实例就必须要继承jQuery.prototype的属性,那么init里面这个this,
就继承jQuery.prototype的属性。但是init里面的this,受制于作用域的限制,并不能访问jQuery.prototype其它的属性,jQuery通过一句'jQuery.fn.init.prototype=jQuery.fn'把它的原型指向jQuery.fn,这样以来,init产生的jQuery对象就拥有了jQuery.fn的属性。
到这里,一个jQuery的基本原型就浮出水面了。这里有两个对象,一个是jQuery这个构造函数,另外一个是这个构造函数产生的对象(我们称之为jQuery对象,它和普通对象没有什么区别),
如下关系图:
可以看到jQuery构造函数和jQuery.prototype均有各自的属性和方法,两者的调用方法各不一样,这两个对象都有一个extend方法,都是用来扩展自身的属性和方法,在jQuery内部,extend的实现实际是靠一样的代码,
将在后面的源码分析中做以详细的分析。