Подтвердить что ты не робот

Как проверить, указывают ли 2 селектора jQuery на один и тот же элемент (ы)?

Если я попробую что-то вроде этого:

$(".foo") === $(".foo") // = false

... Я ошибаюсь. Если я попробую этот запрос,

$(".foo").get(0) === $(".foo").get(0) // = true

... Я прав.

Это потому, что:

{a:myObject} !== {a:myObject};
[myObject]   !== [myObject];
myObject     === myObject;

Мне интересно, есть ли какой-либо лаконичный способ проверить это равенство, желательно встроенное в jQuery. 2-й метод, который я написал, работает корректно, если имеется не более одного элемента, который соответствует .foo. Решение должно работать для любого количества элементов.

Очевидно, я не хочу просто проверять ".foo" === ".foo", так как фактические выборы, которые я использую, более сложны. Я просто упростил их для этого примера. (Например, я могу проверить, что $(this) выбирает ту же самую вещь, что и $(".foo").)

4b9b3361

Ответ 1

В основной библиотеке нет ничего, чтобы проверить равномерность последовательности объектов jQuery, однако следующее должно сделать трюк:

$.fn.sequenceEqual = function(compareTo) {
  if (!compareTo || !compareTo.length || this.length !== compareTo.length) {
    return false;
  }
  for (var i = 0, length = this.length; i < length; i++) {
    if (this[i] !== compareTo[i]) {
      return false;
    }
  }
  return true;
} 

Что можно использовать так:

$(".foo").sequenceEqual($(".bar"))

Для полноты метод равного содержания можно записать так:

$.fn.contentsEqual = function(compareTo) {
  return compareTo && this.length === compareTo.length && this.length === this.filter(compareTo).length;
}

Что можно использовать так:

$(".foo").contentsEqual($(".bar"))

Ответ 2

Я думаю, что вы ищете $().is. Документы здесь.

var foo, bar;

foo = $('foo');
bar = $('.bar');

// This will check to see foo and bar contain the same elements
foo.is(bar); // true | false

Изменить: @lolwut предоставил jsfiddle для этого ответа. Прочитав комментарии, я обновил его и решил, что этот ответ не является надежным для случая OP.

Ответ 3

Если вы хотите проверить, содержат ли оба набора одинаковые элементы (возможно, в другом порядке), то Array#every в сочетании с $.fn.index может выполнить задание:

var $this  = $("p"),
    $other = $("p");


// same length and $other contains each element of $this

var equal = $this.length === $other.length
              && Array.prototype.every.call($this, function(elem) {
                   return $other.index(elem) > -1;
                 });

Ответ 4

В качестве альтернативы ответу pimvdb (что очень приятно, я только предоставляю это для полноты), вы можете использовать тот факт, что add() не будет добавлять элементы, которые уже присутствуют в объекте jQuery. Поэтому вы можете написать:

$.fn.containsSameElements = function(other) {
    var len = this.length;
    return other.length == len && this.add(other).length == len;
};

Ответ 5

Хорошо, используя только встроенные jquery, это кажется правильным.

$(oneSelector).filter($(anotherSelector)).length == 1

if ($ (oneSelector).is($ (anotherSelector)))... они равны