真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

[置頂]   jQuery亂談(二)

今天繼續(xù)分析jQuery.fn.init( selector, context, rootjQuery );的實現(xiàn)。這是我截取的該方法的代碼:

成都一家集口碑和實力的網(wǎng)站建設服務商,擁有專業(yè)的企業(yè)建站團隊和靠譜的建站技術(shù),十年企業(yè)及個人網(wǎng)站建設經(jīng)驗 ,為成都近1000家客戶提供網(wǎng)頁設計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設等服務,包括成都營銷型網(wǎng)站建設,品牌網(wǎng)站建設,同時也為不同行業(yè)的客戶提供網(wǎng)站設計制作、做網(wǎng)站的服務,包括成都電商型網(wǎng)站制作建設,裝修行業(yè)網(wǎng)站制作建設,傳統(tǒng)機械行業(yè)網(wǎng)站建設,傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設。在成都做網(wǎng)站,選網(wǎng)站制作建設服務商就選創(chuàng)新互聯(lián)。

init: function( selector, context, rootjQuery ) {         var match, elem, ret, doc;          // Handle $(""), $(null), $(undefined), $(false)         if ( !selector ) {             return this;         }          // Handle $(DOMElement)         if ( selector.nodeType ) {             this.context = this[0] = selector;             this.length = 1;             return this;         }          // Handle HTML strings         if ( typeof selector === "string" ) {             if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {                 // Assume that strings that start and end with <> are HTML and skip the regex check                 match = [ null, selector, null ];              } else {                 match = rquickExpr.exec( selector );             }              // Match html or make sure no context is specified for #id             if ( match && (match[1] || !context) ) {                  // HANDLE: $(html) -> $(array)                 if ( match[1] ) {                     context = context instanceof jQuery ? context[0] : context;                     doc = ( context && context.nodeType ? context.ownerDocument || context : document );                      // scripts is true for back-compat                     selector = jQuery.parseHTML( match[1], doc, true );                     if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {                         this.attr.call( selector, context, true );                     }                      return jQuery.merge( this, selector );                  // HANDLE: $(#id)                 } else {                     elem = document.getElementById( match[2] );                      // Check parentNode to catch when Blackberry 4.6 returns                     // nodes that are no longer in the document #6963                     if ( elem && elem.parentNode ) {                         // Handle the case where IE and Opera return items                         // by name instead of ID                         if ( elem.id !== match[2] ) {                             return rootjQuery.find( selector );                         }                          // Otherwise, we inject the element directly into the jQuery object                         this.length = 1;                         this[0] = elem;                     }                      this.context = document;                     this.selector = selector;                     return this;                 }              // HANDLE: $(expr, $(...))             } else if ( !context || context.jquery ) {                 return ( context || rootjQuery ).find( selector );              // HANDLE: $(expr, context)             // (which is just equivalent to: $(context).find(expr)             } else {                 return this.constructor( context ).find( selector );             }          // HANDLE: $(function)         // Shortcut for document ready         } else if ( jQuery.isFunction( selector ) ) {             return rootjQuery.ready( selector );         }          if ( selector.selector !== undefined ) {             this.selector = selector.selector;             this.context = selector.context;         }          return jQuery.makeArray( selector, this );     }


下面我們來一段一段的分析:

if ( !selector ) {     return this; }

這段代碼用來處理形如 $("")、$(null)、 $(undefined)、 $(false)的情況,這樣可以增加程序的健壯性,避免用戶操作不規(guī)范時導致整個程序出錯和崩潰。平常我們在寫代碼的時候也應該有這個意識,充分考慮各種情況,從而使測試的時候減少很多不必要的麻煩。另外,在jquery的很多地方,都會返回this,這里的this指向jQuery實例,同時這也是jQuery實現(xiàn)鏈式調(diào)用的方法。

if ( selector.nodeType ) {            this.context = this[0] = selector;            this.length = 1;            return this;  }


上面的這段代碼用于處理類似$(DOMElement)的情況,比如:$(document.getElementById("a"))。這里的this[0]是干嘛的呢?其實很簡單,0是它的屬性名而已。因為 this.0會語法報錯,所以就用了this[0]這樣一個小技巧。下面給出一個例子,一看就明白:

function Person(name,age) {     this[0]     = name;     this['age'] = age;  } var p = new Person("LiLei",22); alert(p[0]); alert(p.age);


至于context和length,更是簡單了,他們倆不過是使用jQuery構(gòu)造器方法生成的jQuery對象的兩個屬性而已。

注意,下面的才是重頭戲:

// Handle HTML strings         if ( typeof selector === "string" ) {             if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {                 // Assume that strings that start and end with <> are HTML and skip the regex check                 match = [ null, selector, null ];              } else {                 match = rquickExpr.exec( selector );             }              // Match html or make sure no context is specified for #id             if ( match && (match[1] || !context) ) {                  // HANDLE: $(html) -> $(array)                 if ( match[1] ) {                     context = context instanceof jQuery ? context[0] : context;                     doc = ( context && context.nodeType ? context.ownerDocument || context : document );                      // scripts is true for back-compat                     selector = jQuery.parseHTML( match[1], doc, true );                     if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {                         this.attr.call( selector, context, true );                     }                      return jQuery.merge( this, selector );                  // HANDLE: $(#id)                 } else {                     elem = document.getElementById( match[2] );                      // Check parentNode to catch when Blackberry 4.6 returns                     // nodes that are no longer in the document #6963                     if ( elem && elem.parentNode ) {                         // Handle the case where IE and Opera return items                         // by name instead of ID                         if ( elem.id !== match[2] ) {                             return rootjQuery.find( selector );                         }                          // Otherwise, we inject the element directly into the jQuery object                         this.length = 1;                         this[0] = elem;                     }                      this.context = document;                     this.selector = selector;                     return this;                 }              // HANDLE: $(expr, $(...))             } else if ( !context || context.jquery ) {                 return ( context || rootjQuery ).find( selector );              // HANDLE: $(expr, context)             // (which is just equivalent to: $(context).find(expr)             } else {                 return this.constructor( context ).find( selector );             }          // HANDLE: $(function)         // Shortcut for document ready         } else if ( jQuery.isFunction( selector ) ) {             return rootjQuery.ready( selector );         }          if ( selector.selector !== undefined ) {             this.selector = selector.selector;             this.context = selector.context;         }          return jQuery.makeArray( selector, this );


上面的這一大段長長的代碼是用來處理$('字符串')和$(function(){})這樣的情況。先說簡單的吧:

if ( jQuery.isFunction( selector ) ) {     return rootjQuery.ready( selector ); }

這段代碼用于當selector參數(shù)是函數(shù)的情況下的操作。因為在JavaScript里,函數(shù)既可以是函數(shù),也可以是對象,所以在jQuery里有很多類似于isFunction的方法依附在jQuery變量上。jQuery.isFunction( selector ) 的實現(xiàn)代碼:

isFunction: function( obj ) {         return jQuery.type(obj) === "function"; }

繼續(xù)查找,jQuery.type(obj)的實現(xiàn):

type: function( obj ) {         return obj == null ?             String( obj ) :             class2type[ core_toString.call(obj) ] || "object"; }


這兒的core_toString是什么意思?實際上在jQuery最開始的時候定義的那一大堆變量里面有:core_toString = Object.prototype.toString。在JavaScript中,一切皆為對象。所以 Object.prototype.toStringcall(obj)可以有以下取值:

[object Array]、[object String]、[object Function]、[object Object]、[object RegExp]、[object Number]、[object Undefined]、[object Null]、[object Date]、[object Boolean]

注:以上的全是字符串。但是在IE6中,卻會出現(xiàn)以下問題:通過Object.prototype.toString.call獲取的 字符串,undefined,null均為Object

 至于class2type,我找到了下面這一大段代碼:

jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {     class2type[ "[object " + name + "]" ] = name.toLowerCase(); });


上面這一段代碼中,jQuery.each的意思就是對于第一個數(shù)組參數(shù)里面的每一個元素執(zhí)行第二個參數(shù)函數(shù)。也就是說:class2type[ "[object Function]" ] = "function"。

所以[object Array]、[object String]、[object Function]、[object Object]、[object RegExp]、[object Number]、[object Date]、[object Boolean]就會全部轉(zhuǎn)化為:"array"、"string"、"function"、"object"、"regexp"、"number"、"date"、"boolean"。

再把以上分析串聯(lián)起來,得出以下結(jié)果:如果selector參數(shù)是函數(shù)的話,執(zhí)行return rootjQuery.ready( selector );代碼。而rootjQuery = jQuery(document);所以rootjQuery.ready( selector )相當于jQuery(document).ready( selector )。使用過jQuery的人應該知道,在jQuery里,jQuery(document).ready( function(){} )表示當文檔的DOM樹構(gòu)建成功后執(zhí)行函數(shù)(這個方法的實現(xiàn)后面再說)。

綜合上述,當selector參數(shù)是函數(shù)時,該函數(shù)會在文檔的DOM樹構(gòu)建成功后執(zhí)行。所以現(xiàn)在我們有了兩種方法在文檔的DOM樹構(gòu)建成功后執(zhí)行代碼:

//方法1: $(document).ready(function() { /*code*/ }); // 這里的$也可以用jQuery  //方法2: $(function() { /*code*/ }); // 這里的$也可以用jQuery


不過$(function() {});方法實際上還是在調(diào)用$(document).ready(function() {});。

上面講了這么多,實際上還是沒有講到最難的那一部分,就是處理字符串的部分,這部分由于涉及到很多jQuery里面其他的函數(shù)和方法,所以我將在明天專門介紹。

 


網(wǎng)頁名稱:[置頂]   jQuery亂談(二)
瀏覽地址:http://weahome.cn/article/gejeos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部