Как бы вы сравнили объекты jQuery?

101

Итак, я пытаюсь понять, как сравнить два объекта jQuery, чтобы увидеть, является ли родительский элемент телом страницы.

вот что у меня есть:

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

Я знаю, что это неправильно, но если кто-нибудь поймет, к чему я клоню, могут ли они указать мне на правильный способ сделать это?

Кайл Хотчкисс
источник
2
var $parent = $(this).parent(), $body = $('body'); var theSame = $parent.is($body); api.jquery.com/is/#is-jQuery-object
Виктор
1
$ (это) .parent (). is ($ ('body')); // или проверьте что-нибудь еще, кроме $ ('body') stackoverflow.com/a/6986013/112100
Omu

Ответы:

158

Вам нужно сравнить необработанные элементы DOM, например:

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

или

if ($(this).parent()[0] === $('body')[0])
Кристиан К. Сальвадо
источник
1
Это обеспечит равенство только в том случае, если объект jQuery соответствует одному элементу DOM. Если бы было несколько совпадений, вам понадобился бы какой-то цикл для сравнения каждого из них.
Джимми Куадра,
1
@ Джимми, да, но этого достаточно для требований OP, он хочет только знать «... если родительский элемент - это тело ...»
Кристиан С. Сальвадо
2
Можно сократить до: if (this.parentNode === document.body);
ehynds
ИМХО, это может быть полезно http://learn.jquery.com/using-jquery-core/jquery-object/#not-all-jquery-objects-are-created
Ajeeb.KP
60

Почему нет:

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

?

Cletus
источник
1
Илиif ($(this).parent().is($("body")))
dieend
18

Цикл не требуется, тестирование единственного первого узла не требуется. Практически ничего не требуется, кроме обеспечения одинаковой длины и одинаковых узлов. Вот небольшой фрагмент кода. Возможно, вы даже захотите преобразовать это в плагин jquery для собственного использования.

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 {}
});
тбраньен
источник
Разве это не говорит о том, что следующие div равны? <div>abc</div> <div>def</div>
Чарли Шлиссер
Нет, фильтр не будет пропускать элементы DOM, которые не равны.
tbranyen
2

Я наткнулся на эти ответы и подумал, какой из них лучше. Все зависит от ваших потребностей, но, конечно, легче всего набрать, прочитать и выполнить. Вот тестовый пример, который я сделал, чтобы принять решение.

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

Салкетер
источник
Raw DOM Elements 2 сообщает о самом быстром для меня: похоже, то же самое для всех других браузеров, о которых сообщили.
Кайл Хотчкисс
Точно, он такой же, как и первый, но использует собственный синтаксический анализ массива javascript.
Salketer