如何检查2个jQuery选择器是否指向相同的元素

How do I check if 2 jQuery selectors are pointing to the same element(s)?

本文关键字:是否 元素 选择器 jQuery 何检查 检查 2个      更新时间:2023-09-26

如果我尝试这样的东西:

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

我错了。如果我尝试这个查询,

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

我明白了。

这是因为:

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

我想知道是否有任何简洁的方法来测试这种相等性,最好是内置在jQuery中。我编写的第二种方法只有在最多有一个元素与.foo匹配的情况下才能正确工作。该解决方案应该适用于任何数量的元素。

显然,我不想只检查".foo" === ".foo",因为我使用的实际选择更复杂。我只是为这个例子简化了它们。(例如,我可能想检查$(this)是否选择了与$(".foo")相同的内容。)

我想您正在寻找$().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的情况来说是不可靠的。

核心库中没有任何东西可以检查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"))

如果您想检查两个集合是否完全包含相同的元素(可能顺序不同),那么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;
                 });

作为pimvdb答案的替代方案(这很好,我只是为了完整性而提供),您可以利用add()不会添加jQuery对象中已经存在的元素这一事实。因此,你可以写:

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

好的,只使用jquery内置,这似乎是正确的

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

if($(oneSelector).is($(anotherSelector))……它们相等