資源描述:
《jquery核心源碼解讀》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、總體架構(gòu)jQuery是個(gè)出色的javascript庫,最近結(jié)合它寫javascript,看了下源碼。先從整體、全局的看,jQuery的源碼幾乎都在下面的代碼中:(function(){//……})();第一個(gè)括號(hào)里面是個(gè)匿名函數(shù),第二個(gè)括號(hào)表示馬上執(zhí)行第一個(gè)括號(hào)里面的代碼。首先明白,javascript里面是沒有命名空間的,要保證你的javascript函數(shù)、對(duì)象與其他的不沖突,這里用了javascript的一個(gè)技巧:你的所有javascript函數(shù)、對(duì)象都在一個(gè)匿名函數(shù)里面定義,確保了所定義的
2、函數(shù)、對(duì)象的有效范圍,起到了命名空間的作用。既然作用范圍在這個(gè)匿名函數(shù)中,怎么被別人使用呢?下面看它的下面代碼:varjQuery=window.jQuery=function(selector,context){//……};這里讓jQuery庫中最重要的對(duì)象jQuery成為了window對(duì)象的一個(gè)屬性,這樣就可以在其他地方像使用document(document也是window的一個(gè)屬性)一樣使用jQuery了。也許使用過jQuery的朋友驚訝-我沒有使用jQuery對(duì)象,一直使用$的。沒錯(cuò),
3、那是jQuery的同名對(duì)象:window.$=jQuery;現(xiàn)在明白了吧。執(zhí)行過程分析JavaScript是一門基于對(duì)象的語言,而它的對(duì)象技術(shù)的實(shí)現(xiàn)又和其他語言有著很大的差異,在JavaScript中,一個(gè)類的定義一般采用下面這種模式(我所看到的)://定義一個(gè)構(gòu)造函數(shù);testClass(param1,param2){this.attr1=param1;this.attr2=param2;...}//在prototype對(duì)象上擴(kuò)展,加上相應(yīng)的方法;testClass.prototype={Me
4、thod1:function(){...},Method2:function(){...},...}//定義一個(gè)實(shí)例;vartest=newtestClass();在jQuery.js中,同樣也是這種模式,只不過它要復(fù)雜很多,而且它還定義了一個(gè)jQuery.extend()的靜態(tài)方法來擴(kuò)展類的功能,jQuery.js代碼執(zhí)行過程完整分析如下://防止多次載入而進(jìn)行jQuery對(duì)象的判斷;if(typeofwindow.jQuery=="undefined"){window.undefined=w
5、indow.undefined;//jQuery的構(gòu)造函數(shù);varjQuery=function(a,c){...};//jQuery的命名空間$;if(typeof$!="undefined")jQuery._$=$;var$=jQuery;//給jQuery的prototype增加一些基礎(chǔ)方法和屬性;//其中有些方法是調(diào)用下面的擴(kuò)展方法實(shí)現(xiàn)的;//注意下面的jQuery.fn=jQuery.prototype;jQuery.fn=jQuery.prototype={each:function
6、(fn,args){...},find:function(t){...},...};//jQuery實(shí)現(xiàn)繼承的方法;jQuery.extend=jQuery.fn.extend=function(obj,prop){...};//實(shí)現(xiàn)一些基礎(chǔ)的函數(shù),有大部分是上面調(diào)用;jQuery.extend({init:function(){...},each:function(obj,fn,args){...},find:function(t,context){...},...});//瀏覽器版本的檢測(cè);
7、newfunction(){jQuery.browser={safari:...,opera:...,msie:...,mozilla:...};...};//jQuery.macros擴(kuò)展,主要用于jQuery.init(),進(jìn)行jQuery的初始化;jQuery.macros={filter:[...],attr:{...},each:{...},...};//jQuery初始化;jQuery.init();//實(shí)現(xiàn)jQuery的重要方法ready();jQuery.fn.extend({r
8、eady:function(f){...}...};//上面ready()方法的具體實(shí)現(xiàn);jQuery.extend({ready:function(){...},...};//對(duì)瀏覽器某些事件進(jìn)行綁定和解綁定;newfunction(){...jQuery.event.add(window,"load",jQuery.ready);};//當(dāng)IE瀏覽器關(guān)閉時(shí),清除上面綁定的事件,防止內(nèi)存泄漏;if(jQuery.browser.msie)jQuery(window).unload(...);/