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 clé de sélection à l'objet o
et obtenir le même résultat. Existe-t-il un meilleur moyen de s’assurer que l’objet est bien un objet jQuery?
Quelque chose en ligne avec (typeof obj == 'jquery')
Vous pouvez utiliser l'opérateur instanceof
:
obj instanceof jQuery
Explication: la fonction jQuery
(alias $
) est implémentée en tant que fonction constructeur . Les fonctions de constructeur doivent être appelées avec le préfixe new
.
Lorsque vous appelez $(foo)
, jQuery traduit en interne ceci en new jQuery(foo)
1. JavaScript commence à initialiser this
dans la fonction constructeur pour pointer sur une nouvelle instance de jQuery
, en définissant ses propriétés sur celles trouvées dans jQuery.prototype
(ou jQuery.fn
). Ainsi, vous obtenez un objet new
où instanceof jQuery
est true
.
1Il s’agit en fait de new jQuery.prototype.init(foo)
: la logique du constructeur a été déchargée sur une autre fonction constructeur appelée init
, mais le concept est le même.
Vous pouvez également utiliser la propriété .jquery comme décrit ici: http://api.jquery.com/jquery-2/
var a = { what: "A regular JS object" },
b = $('body');
if ( a.jquery ) { // falsy, since it's undefined
alert(' a is a jQuery object! ');
}
if ( b.jquery ) { // truthy, since it's a string
alert(' b is a jQuery object! ');
}
Découvrez l'opérateur instanceof .
var isJqueryObject = obj instanceof jQuery
Le meilleur moyen de vérifier l'instance d'un objet consiste à utiliser instanceof operator ou la méthode isPrototypeOf () qui vérifie si le prototype d'un objet se trouve dans la chaîne de prototypes d'un autre objet .
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Mais parfois, cela peut échouer dans le cas de plusieurs instances de jQuery sur un document. Comme @Georgiy Ivankin a mentionné:
si j'ai
$
dans mon espace de noms actuel pointant versjQuery2
et que j'ai un objet de l'espace de noms externe (où$
estjQuery1
), je n'ai aucun moyen d'utiliserinstanceof
pour vérifier si cet objet est unjQuery
objet
Une façon de résoudre ce problème consiste à créer un alias pour l’objet jQuery dans une fermeture ou IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Une autre façon de résoudre ce problème consiste à interroger la propriété jquery
dans obj
'jquery' in obj
Cependant, si vous essayez d'effectuer cette vérification avec des valeurs primitives, une erreur sera générée. Vous pouvez donc modifier la vérification précédente en vous assurant que obj
est un Object
.
'jquery' in Object(obj)
Bien que la méthode précédente ne soit pas la plus sûre (vous pouvez créer la propriété 'jquery'
dans un objet), nous pouvons améliorer la validation en utilisant les deux approches:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Le problème ici est que tout objet peut définir une propriété jquery
comme étant propre. Il serait donc préférable de demander dans le prototype et de s’assurer que l’objet n’est ni null
ni undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
En raison de coercion, l'instruction if
fera un court-circuit en évaluant l'opérateur &&
lorsque obj
correspond à l'une des valeurs falsy ( null
, undefined
, false
, 0
, ""
), puis effectue les autres validations.
Enfin, nous pouvons écrire une fonction utilitaire:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Jetons un coup d'oeil à: Les opérateurs logiques et la vérité/la fausseté
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
Cependant, il existe un autre moyen de vérifier l'objet dans jQuery.
jQuery.type(a); //this returns type of variable.
J'ai fait exemple pour comprendre les choses, lien jsfiddle
Pour ceux qui veulent savoir si un objet est un objet jQuery sans avoir jQuery installé, l'extrait suivant devrait faire le travail:
function isJQuery(obj) {
// Each jquery object has a "jquery" attribute that contains the version of the lib.
return typeof obj === "object" && obj && obj["jquery"];
}
Vous pouvez vérifier si l'objet est produit par JQuery avec la propriété jquery
:
myObject.jquery // 3.3.1
=> retourne le numéro de la version de JQuery si l'objet produit par JQuery . => sinon, il renvoie undefined