2010-11-10 23 views
31

Tengo una función que quiero permitir el paso en un objeto regular de elemento DOM de JavaScript o en un objeto jQuery. Si aún no es un objeto jQuery, lo convertiré en uno.Detectar objeto DOM frente a objeto jQuery

¿Alguien sabe de una manera muy confiable para detectar esto.

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

} 

Un enfoque lógico es detectar una de las propiedades del objeto elemento DOM. La pregunta es, ¿qué propiedad sería la más confiable para detectar?

También podría convertirlo en un objeto jquery en cualquier caso, ya que jQuery no tiene un problema con algo como: $ ($ imajQueryObjAlready); Sin embargo, el propósito de esta pregunta no es simplemente resolver el problema, sino encontrar una buena manera de detectar si se trata de un objeto DOM frente a un objeto jQuery.

Respuesta

58

Para la prueba de un elemento DOM, se puede comprobar su nodeType propiedad:

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

o se puede comprobar la propiedad de jQuery:

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

+1 Dos excelentes soluciones: prefiero la última para la legibilidad. – lonesomeday

+2

@lonesomeday - La única exención de responsabilidad que daría (o debería haber dado) es que no forma parte de la API pública, [actualmente de todos modos] (http: //bugs.jquery.com/ticket/7200), por lo que jQuery podría decidir eliminar esa propiedad algún día. Dudoso sin embargo. – user113716

+4

Es cierto. ¡Por supuesto, a la inversa, jQuery podría decidir agregar una propiedad 'nodeType'! – lonesomeday

8

jQuery hace como este:

if (selector.nodeType) 

(jQuery 1.4.3, línea 109)

13

Para probar para un objeto jQuery, puede utilizar el operador de instanceof:

if(elm instanceof jQuery) { 
    ... 
} 

o:

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

La forma más fácil es simplemente pasarlo a la función de cualquier manera jQuery. Si ya es un objeto jQuery, devolverá sin cambios:

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

A partir del código fuente jQuery, esto es lo que está pasando:

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

return jQuery.makeArray(selector, this); 

Dónde MakeArray está fusionando el nuevo objeto (por defecto) de jQuery con el pasado en uno.

+0

+1 por simplicidad – zzzzBov

+2

No está realmente sin cambios. Obtendrás un nuevo objeto jQuery. Puede haber efectos secundarios. Aquí hay una demostración: http://jsfiddle.net/nu7D6/ – user113716

+0

@Patrick - No, recuperará el objeto jQuery original si ya es un objeto jQuery. $ (selector) === $ ($ (selector)) siempre devuelve verdadero. –

6

elm instanceof jQuery es la manera más infalible, como las pruebas elm.nodeType confundiría {nodeType:1} para un elemento DOM, y prueba de elm.jquery confundiría {jquery:$()} para un objeto jQuery, además a que no hay garantía de futuro objetos jQuery no va a tener una propiedad jquery .

0

La manera elegante:

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

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

Sobre la respuesta de @ karim79, si usted necesita estar seguro de que es ya sea un DOM o un objeto jQuery, utilizar estas pruebas. (La prueba window ayuda a la función a fallar correctamente si la clase no está definida, por ejemplo, jQuery no se pudo cargar).

Cuestiones relacionadas