Question Vérifiez 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 pourriez potentiellement ajouter une touche de sélection à o objet et obtenir le même résultat. Y at-il une meilleure façon de s'assurer que l'objet est réellement un objet jQuery?

Quelque chose en ligne avec (typeof obj == 'jquery')


534
2017-12-05 19:43


origine


Réponses:


Vous pouvez utiliser le instanceof opérateur:

obj instanceof jQuery

Explication: la jQuery fonction (aka $) est mis en œuvre en tant que fonction constructeur. Les fonctions constructeur doivent être appelées avec new préfixe.

Quand vous appelez $(foo), en interne jQuery traduit cela à new jQuery(foo)1. JavaScript procède à l'initialisation this à l'intérieur de la fonction constructeur pour pointer vers une nouvelle instance de jQuery, définissant ses propriétés à celles trouvées sur jQuery.prototype (alias jQuery.fn). Ainsi, vous obtenez un new objet où instanceof jQuery est true.


1C'est en fait new jQuery.prototype.init(foo): la logique constructeur a été déchargée vers une autre fonction constructeur appelée initmais le concept est le même.


802
2017-12-05 19:48



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

100
2018-06-22 18:13



Vérifiez exemple de opérateur.

var isJqueryObject = obj instanceof jQuery

30
2017-12-05 19:53



La meilleure façon de vérifier l'instance d'un objet est de exemple de opérateur ou avec la méthode isPrototypeOf () qui inspecte si le prototype d'un objet est dans la chaîne prototype d'un autre objet.

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

Mais parfois, il peut échouer dans le cas de plusieurs instances jQuery sur un document. Comme l'a mentionné @Georgiy Ivankin:

si j'ai $ dans mon espace de noms actuel pointant vers jQuery2 et j'ai un objet de l'espace de noms externe (où $ est jQuery1) alors 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 à aliaser l'objet jQuery dans un 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 surmonter ce problème est de demander au jquery propriété 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 obj être un Object

'jquery' in Object(obj)

Bien que la manière précédente ne soit pas la plus sûre (vous pouvez créer 'jquery' propriété dans un objet), nous pouvons améliorer la validation en travaillant avec les deux approches:

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

Le problème ici est que n'importe quel 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 pas null ou undefined

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }


20
2017-07-28 21:50



return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);

3
2017-09-13 13:24



Cependant, il existe une autre façon de vérifier l'objet dans jQuery.

jQuery.type(a); //this returns type of variable.

J'ai fait un exemple pour comprendre les choses, jsfiddle lien


2
2017-08-17 10:06



Pour ceux qui veulent savoir si un objet est un objet jQuery sans avoir installé jQuery, 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"];
}

1
2017-12-15 05:20



var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE

-9
2017-10-18 21:13