Existe-t-il un moyen rapide de vérifier si un objet est un objet jQuery ou un objet JavaScript natif?
exemple:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
évidemment, le code ci-dessus fonctionne mais ce n'est pas sûr. Vous pouvez potentiellement ajouter une touche de sélection à l' o
objet et obtenir le même résultat. Existe-t-il une meilleure façon de s'assurer que l'objet est bien un objet jQuery?
Quelque chose en ligne avec (typeof obj == 'jquery')
javascript
jquery
David Hellsing
la source
la source
selector
propriété a été dépréciée il y a longtemps et supprimée dans 3.0. Même dans les versions antérieures, un objet jQuery peut avoir une chaîne de sélecteur vide, par exemple$(window)
sans sélecteur. Utilisezinstanceof
plutôt.Réponses:
Vous pouvez utiliser l'
instanceof
opérateur:Explication : la
jQuery
fonction (aka$
) est implémentée en tant que fonction constructeur . Les fonctions constructeur doivent être appelées avec lenew
préfixe.Lorsque vous appelez
$(foo)
, jQuery en interne traduit cela parnew jQuery(foo)
1 . JavaScript procède à l'initialisationthis
à l'intérieur de la fonction constructeur pour pointer vers une nouvelle instance dejQuery
, en définissant ses propriétés sur celles trouvées surjQuery.prototype
(akajQuery.fn
). Ainsi, vous obtenez unnew
objet oùinstanceof jQuery
esttrue
.1 C'est en fait
new jQuery.prototype.init(foo)
: la logique constructeur a été déchargée vers une autre fonction constructeur appeléeinit
, mais le concept est le même.la source
if (obj instanceof jQuery){...}
?typeof jQuery === 'function' && obj instanceof jQuery
car iljQuery
n'est pas nécessaire de le déclarer pour que l'typeof
opérateur fonctionne sans générer d'erreur.Vous pouvez également utiliser la propriété .jquery comme décrit ici: http://api.jquery.com/jquery-2/
la source
b instanceof jQuery
renvoie une ReferenceError si jQuery n'est pas disponible sur la page. Les deux approches sont utiles dans des cas différents.try ... catch
, en particulier dans oldIE.if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
a
ce soit un nœud DOM,document.body
et puis, théoriquement, il est possible que lajquery
clé soit en quelque sorte sur la chaîne de ce nœud.Découvrez l' opérateur instanceof .
la source
La meilleure façon de vérifier l'instance d'un objet est via l' opérateur instanceof ou avec la méthode isPrototypeOf () qui inspecte si le prototype d'un objet se trouve dans la chaîne de prototypes d'un autre objet.
Mais parfois, il peut échouer dans le cas de plusieurs instances jQuery sur un document. Comme l'a mentionné @Georgiy Ivankin:
Une façon de résoudre ce problème consiste à aliaser l'objet jQuery dans une fermeture ou IIFE
Pour résoudre ce problème, vous pouvez également demander à la
jquery
propriétéobj
Cependant, si vous essayez d'effectuer cette vérification avec des valeurs primitives, cela générera une erreur, vous pouvez donc modifier la vérification précédente en vous assurant
obj
d'être unObject
Bien que la méthode précédente ne soit pas la plus sûre (vous pouvez créer la
'jquery'
propriété dans un objet), nous pouvons améliorer la validation en travaillant avec les deux approches:Le problème ici est que tout objet peut définir une propriété
jquery
comme propre, donc une meilleure approche serait de demander dans le prototype, et de s'assurer que l'objet n'est pasnull
ouundefined
En raison de la contrainte , la
if
déclaration fera un court - circuit en évaluant l'&&
opérateur lorsqueobj
est l' un des falsy valeurs (null
,undefined
,false
,0
,""
), et procède ensuite à effectuer les autres validations.Enfin, nous pouvons écrire une fonction utilitaire:
Jetons un coup d'œil à: Opérateurs logiques et vérité / fausse
la source
||
cela avec un'jquery' in Object(obj)
, cependant, cela va s'écouler, car cela n'empêchera pas les objets non jQuery avec cette propriété de passer la vérification. Je crois cependant que la vérification de cette propriété dans le prototype améliore la situation. Vous devriez peut-être ajouter cela à votre réponse! Je ne pense pas qu'une autre réponse ici mentionne cette possibilité :)obj.__proto__.jquery
au lieu deobj.constructor.prototype.jquery
assez? juste un peu court :)constructor.prototype
carobj
est censé être une instance du constructeur, c'est-à-direjQuery
. D'autre part__proto__
est disponible pour tout type d'objet.la source
nodeType
propriété et garantir qu'uneboolean
valeur soit renvoyée, vous pouvez utiliser la double négation!!(el && el.nodeType)
Cependant, il existe un autre moyen de vérifier l'objet dans jQuery.
J'ai fait exemple pour comprendre les choses, lien jsfiddle
la source
Pour ceux qui veulent savoir si un objet est un objet jQuery sans avoir installé jQuery, l'extrait de code suivant devrait faire le travail:
la source
Vous pouvez vérifier si l'objet est produit par JQuery avec la
jquery
propriété:=> retourne le numéro de la version JQuery si l'objet produit par JQuery. => sinon, il retourne
undefined
la source
la source