2010-11-10 5 views
31

J'ai une fonction que je veux pouvoir autoriser en passant un objet élément DOM javascript normal ou un objet jQuery. Si ce n'est pas encore un objet jQuery, je vais en faire un.Détection de l'objet DOM par rapport à l'objet jQuery

Est-ce que quelqu'un sait d'une manière très fiable de détecter cela.

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

} 

Une approche logique consiste à détecter l'une des propriétés de l'objet élément DOM. La question est, quelle propriété serait la plus fiable à détecter?

Je pourrais aussi juste en faire un objet jquery de toute façon puisque jQuery n'a pas de problème avec quelque chose comme: $ ($ imajQueryObjAlready); Cependant, le but de cette question n'est pas simplement de résoudre le problème, mais de trouver un bon moyen de détecter s'il s'agit d'un objet DOM ou d'un objet jQuery.

Répondre

58

Pour tester un élément DOM, vous pouvez vérifier sa nodeType propriété:

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

ou vous pouvez vérifier la propriété jQuery:

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

+1 Deux excellentes solutions - Je préfère cette dernière pour la lisibilité. – lonesomeday

+2

@lonesomeday - Le seul avertissement que je donnerais (ou aurais dû donner) est qu'il ne fait pas partie de l'API publique, [actuellement de toute façon] (http: //bugs.jquery.com/ticket/7200), donc jQuery pourrait décider de supprimer cette propriété un jour. Douteux cependant. – user113716

+4

True. Bien sûr, inversement, jQuery pourrait décider d'ajouter une propriété 'nodeType'! – lonesomeday

8

jQuery fait comme ceci:

if (selector.nodeType) 

(jQuery 1.4.3, ligne 109)

13

Pour tester un objet jQuery, vous pouvez utiliser l'opérateur instanceof:

if(elm instanceof jQuery) { 
    ... 
} 

ou:

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

La façon la plus simple est de passer simplement dans la fonction jQuery ou l'autre manière. S'il est déjà un objet jQuery, il le retourne sans changement:

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

À partir du code source jQuery, voici ce qui se passe:

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

return jQuery.makeArray(selector, this); 

Où MakeArray est la fusion de la nouvelle (par défaut) objet jQuery avec le passé en un.

+0

+1 pour plus de simplicité – zzzzBov

+2

Il n'est pas vraiment inchangé. Vous obtenez un nouvel objet jQuery. Il pourrait y avoir des effets secondaires. Voici une démo: http://jsfiddle.net/nu7D6/ – user113716

+0

@Patrick - Non, vous récupérez l'objet jQuery d'origine s'il s'agit déjà d'un objet jQuery. $ (selector) === $ ($ (selector)) retourne toujours vrai. –

6

elm instanceof jQuery est la façon la plus à toute épreuve, comme les tests elm.nodeType confondrait {nodeType:1} pour un élément DOM, et tester elm.jquery confondrait {jquery:$()} pour un objet jQuery, en plus qu'il y ait pas d'avenir de garantie des objets jQuery pas une propriété jquery .

0

La manière élégante:

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

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

bâtiment sur @ réponse de karim79, si vous devez être sûr il est soit un DOM ou d'un objet jQuery, utilisez ces tests. (Le test window aide la fonction à échouer correctement si la classe n'est pas définie, par exemple si jQuery n'a pas pu être chargé.)

Questions connexes