Wie würden Sie jQuery-Objekte vergleichen?

101

Ich versuche also herauszufinden, wie zwei jQuery-Objekte verglichen werden, um festzustellen, ob das übergeordnete Element der Hauptteil einer Seite ist.

Folgendes habe ich:

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

Ich weiß, dass dies falsch ist, aber wenn jemand versteht, worauf ich hinaus will, könnte er mich dann auf den richtigen Weg hinweisen?

Kyle Hotchkiss
quelle
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')); // oder suchen
Omu

Antworten:

158

Sie müssen die rohen DOM-Elemente vergleichen, z.

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

oder

if ($(this).parent()[0] === $('body')[0])
CMS
quelle
1
Dies stellt nur dann die Gleichheit sicher, wenn das jQuery-Objekt mit einem einzelnen DOM-Element übereinstimmt. Wenn es mehrere Übereinstimmungen gäbe, würden Sie eine Schleife benötigen, um jede zu vergleichen.
Jimmy Cuadra
1
@ Jimmy, ja, aber das ist genug für die OP-Anforderungen, er will nur wissen "... wenn das übergeordnete Element der Körper ist ..."
CMS
2
Kann verkürzt werden zu: if (this.parentNode === document.body);
ehynds
60

Warum nicht:

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

?

Cletus
quelle
1
Oderif ($(this).parent().is($("body")))
sterben Sie
18

Eine Schleife ist nicht erforderlich, das Testen des einzelnen ersten Knotens ist nicht erforderlich. Es ist so gut wie nichts erforderlich, außer sicherzustellen, dass sie gleich lang sind und identische Knoten gemeinsam haben. Hier ist ein kleiner Code-Ausschnitt. Vielleicht möchten Sie dies sogar in ein JQuery-Plugin für Ihre eigenen Zwecke konvertieren.

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
quelle
Würde dies nicht bedeuten, dass die folgenden Divs gleich sind? <div>abc</div> <div>def</div>
Charlie Schliesser
Nein, der Filter würde keine DOM-Elemente übergeben, die nicht gleich sind.
Tbranyen
2

Ich stolperte über diese Antworten und fragte mich, welche besser war. Es hängt alles von Ihren Anforderungen ab, aber am einfachsten zu tippen, zu lesen und auszuführen ist natürlich das Beste. Hier ist der Perf-Testfall, den ich getroffen habe, um eine Entscheidung zu treffen.

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

Salketer
quelle
Raw DOM Elements 2 meldet für mich die schnellste Meldung: Sieht auch für alle anderen gemeldeten Browser gleich aus.
Kyle Hotchkiss
Genau, es ist das gleiche wie das erste, verwendet jedoch das native Array-Parsing von Javascript.
Salketer