2012-02-22 63 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; 
}; 
相關問題