Jak porównasz obiekty jQuery?

101

Więc próbuję dowiedzieć się, jak porównać dwa obiekty jQuery, aby sprawdzić, czy element nadrzędny jest treścią strony.

oto co mam:

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

Wiem, że to źle, ale jeśli ktoś rozumie, do czego zmierzam, czy może wskazać mi właściwy sposób zrobienia tego?

Kyle Hotchkiss
źródło
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')); // lub poszukaj czegoś innego oprócz $ ('body') stackoverflow.com/a/6986013/112100
Omu

Odpowiedzi:

158

Musisz porównać surowe elementy DOM, np:

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

lub

if ($(this).parent()[0] === $('body')[0])
Christian C. Salvadó
źródło
1
Zapewni to równość tylko wtedy, gdy obiekt jQuery pasuje do pojedynczego elementu DOM. Gdyby było wiele dopasowań, potrzebowałbyś jakiejś pętli do porównania każdego z nich.
Jimmy Cuadra
1
@Jimmy, tak, ale to wystarczy dla wymagań OP, chce tylko wiedzieć, „... jeśli elementem nadrzędnym jest ciało ...”
Christian C. Salvadó
2
Można skrócić do: if (this.parentNode === document.body);
ehynds
60

Dlaczego nie:

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

?

cletus
źródło
1
Lubif ($(this).parent().is($("body")))
koniec
18

Pętle nie są wymagane, testowanie pierwszego pojedynczego węzła nie jest wymagane. Prawie nic nie jest wymagane poza upewnieniem się, że są tej samej długości i mają identyczne węzły. Oto mały fragment kodu. Możesz nawet przekonwertować to na wtyczkę jquery do własnych celów.

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
źródło
Czy nie oznaczałoby to, że następujące elementy div są równe? <div>abc</div> <div>def</div>
Charlie Schliesser,
Nie, filtr nie przepuści elementów DOM, które nie są równe.
tbranyen
2

Natknąłem się na te odpowiedzi i zastanawiałem się, która z nich jest lepsza. Wszystko zależy od twoich potrzeb, ale najłatwiejszy do wpisania, odczytania i wykonania jest oczywiście najlepszy. Oto przykład testu perf, który wykonałem, aby podjąć decyzję.

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

Salketer
źródło
Raw DOM Elements 2 raportuje najszybciej dla mnie: wygląda tak samo w każdej innej raportowanej przeglądarce.
Kyle Hotchkiss
Dokładnie, jest taki sam jak pierwszy, ale wykorzystuje natywną analizę tablicy javascript.
Salketer