2012-09-19 42 views
4

所以我有一個難題,希望有人已經擁有了答案。閱讀jQuery源代碼,我還沒有理解這裏真正發生了什麼。當jQuery自動傳遞時真的發生了什麼?

$('#div')  //returns a jQuery object 
$($('#div')) // returns an identical jQuery object 
$($($($($($('#div')))))) // returns the same idential object 

我遇到了插件開發中的實例,我不知道期望sting選擇器或jQuery對象。在那些情況下,我只是簡單地將選擇器或jQuery對象傳遞給jQuery,以便保證我想要的jQuery對象。它運作良好,但感覺太神奇了。當我這樣做時,真正發生了什麼?有沒有更好的辦法?

+0

沒有魔法...這是由設計。你有很多方法來指定一個選擇器。字符串和DOM對象都很好。 – Brad

+3

發生這種情況:http://jsapi.info/jquery/1.8.0/jQuery.fn.init :) – Andreas

+0

@Brad我知道,並利用目前的功能。我只想知道發生了什麼。 – Fresheyeball

回答

1

基本我覺得在功能$(...)這存在一些基本情況。

  • 在Arg中是String類型,傳遞它並查找或創建HTML Dom元素,然後將其封裝到JQuery對象中。
  • 在精氨酸是HTML DOM型,膠囊對象變成一個jQuery對象
  • 在精氨酸是jQuery對象,迴歸它,因爲這是

但在現實更多的案例存在和調試的戰利品並在此之前進行錯誤檢查。

查看更多的在http://jsapi.info/jquery/1.8.0/jQuery.fn.init 我可以從代碼中看到,如果我們有。的xy

var x = $('#div'); 
var y = $(x); 

含量等於 但x存儲器和y是不相等的。

說我們有:

class $ { 
    var x; 
    $($ t) { 
    this.x = t.x 
    } 
} 

這會怎麼做,如果我們所有的呼叫$這將具有相同的內在價值 但不是真正的相同的兩個不同的對象。

+0

fn.init上的哪行處理此實例? – Fresheyeball

+0

我可以看到,在177到182行上,女巫並不確定。 但我認爲發生的是,jQuery將元素複製到新的。 –

1

在回答這個問題之前,需要了解$(...)返回一個具有類數組屬性的特殊對象。從文檔:

jQuery的工廠函數$()返回一個具有許多陣列的 的特性(長度時,[]數組訪問運算符, 等)jQuery對象,但不完全是與數組相同,並且缺少一些 數組的內置方法(如.pop()和.reverse())。

所以,這就是發生了什麼。不管選擇器的類型的

  1. new jQuery.fn.init(selector, context, rootjQuery);被調用,因此一個新的對象被創建,其性能列於這個init()構造方法設置。

  2. 參數$(...)通過檢查空白,DOMElement,字符串或函數(通過isFunction)

所有檢查失敗,最後調用下面的代碼。

if (selector.selector !== undefined) { 
    this.selector = selector.selector; 
    this.context = selector.context; 
} 
return jQuery.makeArray(selector, this); 

功能makeArray(),而它仍然基於jQuery原型對象輪流提供選擇成陣列狀物體,通過簡單地設置this.length屬性和this.ret[0]=..., this.ret[1]=...使得它「感覺」像陣列(又名$.fn) 。請記住,上面的代碼中的this僅僅是原型中帶有$.fn的全新對象。 此外,.selector.context屬性從原始複製到此。

重要的是要注意,例如, .prevObject屬性將丟失,但可能會添加新的屬性,具體取決於方法鏈接。

總而言之,這需要時間和內存,當有人可能將jQuery對象傳遞到您的插件時,只需檢查.selector就可以了。另一方面,具有與原創相同行爲的新實例可能會有所幫助。

相關問題