2010-11-10 12 views
31

Ho una funzione che voglio essere in grado di consentire il passaggio in un oggetto elemento DOM javascript normale o in un oggetto jQuery. Se non è ancora un oggetto jQuery, lo renderò uno.Rileva oggetto DOM contro jQuery Object

Qualcuno sa di un modo molto affidabile per rilevare questo.

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

} 

Un approccio logico consiste nel rilevare una delle proprietà dell'oggetto elemento DOM. La domanda è: quale proprietà sarebbe la più affidabile da rilevare?

Potrei anche solo renderlo un oggetto jquery in entrambi i casi poiché jQuery non ha problemi con qualcosa del tipo: $ ($ imajQueryObjAlready); Tuttavia, lo scopo di questa domanda non è solo risolvere il problema, ma trovare un buon modo per rilevare se si tratta di un oggetto DOM o di un oggetto jQuery.

risposta

58

Per verificare un elemento DOM, è possibile controllare la sua proprietà nodeType:

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

o si potrebbe controllare la proprietà jQuery:

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

+1 Due soluzioni eccellenti: preferisco quest'ultimo per la leggibilità. – lonesomeday

+2

@lonesomeday - L'unica limitazione di responsabilità che darei (o che avrei dovuto fornire) è che non fa parte dell'API pubblica, [attualmente comunque] (http: //bugs.jquery.com/ticket/7200), così jQuery potrebbe decidere di rimuovere la proprietà un giorno. Però dubbioso. – user113716

+4

Vero. Ovviamente, jQuery potrebbe decidere di aggiungere una proprietà 'nodeType'! – lonesomeday

8

jQuery lo fa in questo modo:

if (selector.nodeType) 

(jQuery 1.4.3, riga 109)

13

Per verificare un oggetto jQuery, è possibile utilizzare l'operatore di instanceof:

if(elm instanceof jQuery) { 
    ... 
} 

o:

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

Il modo più semplice è quello di passare semplicemente alla funzione jQuery in entrambi i casi. Se è già un oggetto jQuery, tornerà invariato:

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

dal codice sorgente jQuery, questo è quello che sta succedendo:

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

return jQuery.makeArray(selector, this); 

Dove MakeArray sta fondendo il nuovo oggetto (di default) jQuery con il passato in uno.

+0

+1 per semplicità – zzzzBov

+2

Non è davvero invariato. Stai ottenendo un nuovo oggetto jQuery. Ci potrebbero essere effetti collaterali. Ecco una demo: http://jsfiddle.net/nu7D6/ – user113716

+0

@Patrick - No, si otterrà l'oggetto jQuery originale indietro se è già un oggetto jQuery. $ (selettore) === $ ($ (selettore)) restituisce sempre true. –

6

elm instanceof jQuery è il modo più infallibile, come test elm.nodeType scambierebbe {nodeType:1} per un elemento DOM, e testare elm.jquery scambierebbe {jquery:$()} per un oggetto jQuery, oltre che vi sia alcun futuro garanzia oggetti jQuery non avrà una proprietà jquery .

0

Il modo elegante:

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

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

Sulla base di @ karim79 risposta, se avete bisogno di essere sicuri è sia un DOM o un oggetto jQuery, utilizzare questi test. (Il test window aiuta la funzione a fallire correttamente se la classe non è definita, ad esempio jQuery non è riuscito a caricare.)

Problemi correlati