2010-11-10 106 views
31

我有一個函數,我希望能夠允許傳遞一個常規的javascript DOM元素對象或jQuery對象。如果它還不是一個jQuery對象,那麼我將它做成一個。檢測DOM對象與jQuery對象

有沒有人知道一個非常可靠的方式來檢測到這一點。

function functionName(elm){ 
    //Detect if elm is not a jquery object in condition 
    if (elm) elm = $(elm); 

} 

邏輯方法是檢測DOM元素對象的屬性之一。問題是,哪個屬性是最可靠的檢測?我也可以使它成爲一個jQuery對象,因爲jQuery沒有像下面這樣的問題:$($ imajQueryObjAlready);然而,這個問題的目的不是爲了解決問題,而是爲了找到一種檢測DOM對象與jQuery對象的好方法。

回答

58

要測試DOM元素,你可以檢查其nodeType屬性:

if(elm.nodeType) { 
    // Was a DOM node 
} 

,或者你可以檢查jQuery的屬性:

if(elm.jquery) { 
    // Was a jQuery object 
} 
+3

+1兩個優秀的解決方案 - 我更喜歡後者的易讀性。 – lonesomeday 2010-11-10 00:22:38

+2

@lonesomeday - 我給(或應該給)的唯一免責聲明是它不是公共API的一部分,[目前無論如何](http://bugs.jquery)。com/ticket/7200),所以jQuery可能決定在某一天刪除該屬性。雖然令人懷疑。 – user113716 2010-11-10 00:25:39

+4

是的。當然,相反,jQuery可以決定添加一個'nodeType'屬性! – lonesomeday 2010-11-10 00:30:21

8

jQuery不會是這樣的:

if (selector.nodeType) 

(jQuery 1.4.3,line 109)

13

要測試一個jQuery對象,你可以使用instanceof操作:

if(elm instanceof jQuery) { 
    ... 
} 

或:

if(elm instanceof $) { 
    ... 
} 
6

最簡單的方法就是簡單地將其傳遞到jQuery的功能兩種方式。如果它已經是一個jQuery對象,它會原樣返回:

function(elem){ 
    elem = $(elem); 
    ... 
} 

從jQuery的源代碼,這是發生了什麼事:

if (selector.selector !== undefined) { 
    this.selector = selector.selector; 
    this.context = selector.context; 
} 

return jQuery.makeArray(selector, this); 

凡makeArray與合併新(默認)jQuery對象通過一個。

+0

+1爲簡化 – zzzzBov 2010-11-10 00:20:16

+2

它並沒有真正改變。你得到一個新的jQuery對象。可能會有副作用。這裏有一個演示:http://jsfiddle.net/nu7D6/ – user113716 2010-11-10 00:21:41

+0

@Patrick - 不,如果它已經是jQuery對象,你會得到原始的jQuery對象。 $(selector)=== $($(selector))總是返回true。 – 2010-11-10 00:26:08

6

elm instanceof jQuery是最萬無一失的方法,如測試elm.nodeType會誤以爲{nodeType:1} DOM元素,並測試elm.jquery會誤以爲{jquery:$()}一個jQuery對象,除了那裏是沒有保證未來的jQuery對象不會有jquery屬性。

0

上等的方式:

function is_jquery_object(x) { 
    return window.jQuery && x instanceof jQuery; 
} 

function is_dom_object(x) { 
    return window.HTMLElement && x instanceof HTMLElement; 
} 

大廈@ karim79的答案,如果你需要確保它要麼一個DOM或jQuery對象,使用這些測試。 (window測試有助於在沒有定義類的情況下優雅地失敗,例如jQuery無法加載。)