Comment compareriez-vous les objets jQuery?

101

J'essaie donc de comprendre comment comparer deux objets jQuery, pour voir si l'élément parent est le corps d'une page.

voici ce que j'ai:

if ( $(this).parent() === $('body') ) ...

Je sais que c'est faux, mais si quelqu'un comprend ce à quoi je veux en venir, pourrait-il m'indiquer la bonne façon de procéder?

Kyle Hotchkiss
la source
2
var $parent = $(this).parent(), $body = $('body'); var theSame = $parent.is($body); api.jquery.com/is/#is-jQuery-object
Victor
1
$ (this) .parent (). is ($ ('body')); // ou vérifiez autre chose que $ ('body') stackoverflow.com/a/6986013/112100
Omu

Réponses:

158

Vous devez comparer les éléments DOM bruts, par exemple:

if ($(this).parent().get(0) === $('body').get(0))

ou

if ($(this).parent()[0] === $('body')[0])
CMS
la source
1
Cela ne garantira l'égalité que si l'objet jQuery correspond à un seul élément DOM. S'il y avait plusieurs correspondances, vous auriez besoin d'une boucle pour les comparer.
Jimmy Cuadra
1
@Jimmy, oui mais cela suffit pour les exigences de l'OP, il veut seulement savoir "... si l'élément parent est le corps ..."
CMS
2
Peut être raccourci en: if (this.parentNode === document.body);
ehynds
60

Pourquoi pas:

if ($(this).parent().is("body")) {
  ...
}

?

cletus
la source
1
Ouif ($(this).parent().is($("body")))
fin du
18

Le bouclage n'est pas nécessaire, le test du premier nœud n'est pas nécessaire. Il n'y a pratiquement rien d'autre à faire que de s'assurer qu'ils ont la même longueur et partagent des nœuds identiques. Voici un petit extrait de code. Vous voudrez peut-être même le convertir en un plugin jquery pour vos propres utilisations.

jQuery(function($) {
  // Two separate jQuery references
  var divs = $("div");
  var divs2 = $("div");

  // They are equal
  if (divs.length == divs2.length && divs.length == divs.filter(divs2).length) {         

  // They are not
  } else {}
});
tbranyen
la source
Cela ne veut-il pas dire que les divs suivants sont égaux? <div>abc</div> <div>def</div>
Charlie Schliesser
Non, le filtre ne transmettra pas les éléments DOM qui ne sont pas égaux.
tbranyen
2

Je suis tombé sur ces réponses et je me suis demandé laquelle était la meilleure. Tout dépend de vos besoins, mais le plus simple à taper, lire et exécuter est bien sûr le meilleur. Voici le test de performance que j'ai fait pour prendre une décision.

http://jsperf.com/jquery-objects-comparison

Salketer
la source
Le rapport brut des éléments DOM 2 est le plus rapide pour moi: il ressemble également à tous les autres navigateurs signalés.
Kyle Hotchkiss
Exactement, c'est le même que le premier mais utilise l'analyse native des tableaux de javascript.
Salketer