2012-02-22 29 views
14

如果我尝试一些像这样的:如何检查2个jQuery选择器是否指向相同的元素?

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

...我得到错误的。如果我试试这个查询,

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

......我说的是对的。

这是因为:

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

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

显然我不想检查".foo" === ".foo",因为我使用的实际选择比较复杂。这个例子我简化了它们。 (例如,我可能要检查$(this)是选择同样的事情$(".foo")。)

+0

你应该检查benekastah的答案,这里是反映他的回答演示:http://jsfiddle.net/kAv4X/ – MacMac 2012-02-22 18:52:50

+0

@lolwut:既然不工作'是( )'只检查*至少有一个元素匹配另一个选择器(即它是一个子集)。看看:http://jsfiddle.net/dYAH3/(它应该在第一个提醒中说错,但它说的是真的)。 – Senseful 2012-02-22 19:01:31

+0

This [answer](http://stackoverflow.com/a/3856290/989121)似乎是最准确的。 – georg 2012-02-22 19:30:41

回答

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")) 
-1

好了,只使用jQuery的内置函数,这似乎是正确的

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

如果($(oneSelector) 。是($(anotherSelector)))......他们是平等的

+6

编号从[文档](http://api.jquery.com/is/):*“根据选择器,元素或jQuery对象检查当前匹配的元素集合,并且如果**至少一个**这些元素符合给定的论点。“*(我强调)。 – 2012-02-22 18:15:21

+1

您用'filter'更新的答案仍然不正确,尽管这是一大进步。您需要根据原始匹配元素集的长度来检查“长度”,而不是“1”。 – 2012-02-22 19:17:22

+0

@ T.J.Crowder:只要他们比较一个单一元素(见问题),那很好。无论如何,filter()是正确的方式,这是jQuery在内部如何实现is()。 – georg 2012-02-22 19:24:50

4

如果你想检查两个集合是否包含正好相同的要素NTS(可能以不同的顺序),然​​后结合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; 
       }); 
8

我认为你正在寻找$().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

这应该是正确的答案。 – MacMac 2012-02-22 18:51:56

+3

@lolwut,nope,如果*至少有一个元素与给定参数*匹配,则is()将返回true。 – 2012-02-22 18:54:23

+0

看看[T.J. Crowder的评论](http://stackoverflow.com/questions/9400500/how-do-i-check-if-2-jquery-selectors-are-pointing-to-the-same-elements/9401119#comment11878467_9400543)解释为什么这不起作用。 – Senseful 2012-02-22 18:55:13

3

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

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