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

时间:2012-02-22 18:10:43

标签: javascript jquery jquery-selectors equality

如果我尝试这样的事情:

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

......我弄错了。如果我改为尝试此查询,

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

......我明白了。

那是因为:

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

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

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

5 个答案:

答案 0 :(得分:13)

我认为您正在寻找$().isDocs here

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的案例不可靠。

答案 1 :(得分:7)

核心库中没有任何内容可以检查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 :(得分:4)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:-1)

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

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

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