web-dev-qa-db-fra.com

Vérifier si l'objet est un objet jQuery

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')

558
David Hellsing

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 newinstanceof 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.

827
Crescent Fresh

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! ');
}
104
mt81

Découvrez l'opérateur instanceof .

var isJqueryObject = obj instanceof jQuery
30
Corey Sunwold

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 vers jQuery2 et que j'ai un objet de l'espace de noms externe (où $ est jQuery1), je n'ai aucun moyen d'utiliser instanceof pour vérifier si cet objet est un jQuery 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é

22
jherax
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
3
johnchou

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

3
Shaunak Shukla

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"];
}
2
Karl.S

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

1
Jérôme Toulouse