2012-02-22 37 views
14

Nếu tôi thử một số nội dung như sau:Làm cách nào để kiểm tra xem 2 bộ chọn jQuery có trỏ đến cùng một phần tử không?

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

... Tôi hiểu sai. Nếu thay vào đó, tôi thử truy vấn này,

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

... Tôi nhận được sự thật.

Đó là bởi vì:

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

Tôi đang tự hỏi nếu có bất kỳ cách nào ngắn gọn để kiểm tra sự bình đẳng này, tốt nhất là xây dựng thành jQuery. Phương pháp thứ 2 tôi đã viết chỉ hoạt động chính xác nếu có nhiều nhất một phần tử khớp với .foo. Giải pháp sẽ hoạt động với bất kỳ lượng yếu tố nào.

Rõ ràng là tôi không muốn chỉ kiểm tra ".foo" === ".foo" vì các lựa chọn thực tế mà tôi đang sử dụng phức tạp hơn. Tôi chỉ đơn giản hóa chúng cho ví dụ này. (Ví dụ: Tôi có thể muốn kiểm tra xem $(this) là lựa chọn điều tương tự như $(".foo").)

+0

Bạn nên kiểm tra câu trả lời benekastah của, đây là một bản demo phản ánh câu trả lời của mình: http://jsfiddle.net/kAv4X/ – MacMac

+0

@lolwut: điều đó không làm việc kể từ 'là () 'chỉ kiểm tra rằng * ít nhất một * của các phần tử khớp với bộ chọn khác (nghĩa là nó là tập hợp con). Hãy xem: http://jsfiddle.net/dYAH3/ (nó nên nói sai trong cảnh báo đầu tiên, nhưng nó nói đúng). – Senseful

+0

Câu trả lời này (http://stackoverflow.com/a/3856290/989121) có vẻ chính xác nhất. – georg

Trả lời

7

Không có gì trong thư viện lõi để kiểm tra bình đẳng chuỗi các đối tượng jQuery là, tuy nhiên sau đây sẽ làm các trick:

$.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; 
} 

Đó sẽ là sử dụng được như vậy:

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

Để hoàn chỉnh, một nội dung phương pháp bình đẳng có thể được viết như sau:

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

Đó sẽ là sử dụng được như vậy:

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

Ok, chỉ sử dụng dựng sẵn jquery, điều này có vẻ là đúng một

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

if ($ (oneSelector) .là ($ (anotherSelector))) ... họ đều bình đẳng

+6

No. Từ [tài liệu] (http://api.jquery.com/is/): * "Kiểm tra tập hợp các phần tử phù hợp hiện tại với một bộ chọn, phần tử hoặc đối tượng jQuery và trả về true nếu ** ít nhất một ** của các phần tử này khớp với các đối số đã cho. "* (sự nhấn mạnh của tôi). –

+1

Câu trả lời cập nhật của bạn với 'bộ lọc' vẫn không đúng, mặc dù đó là một bước tiến lớn. Bạn sẽ cần phải kiểm tra 'length' so với độ dài của tập hợp các phần tử đã so khớp ban đầu, chứ không phải' 1'. –

+0

@ T.J.Crowder: miễn là chúng so sánh một phần tử duy nhất (xem câu hỏi), điều đó là tốt. Dù sao, filter() là một cách chính xác, đây là cách jQuery thực hiện() nội bộ. – georg

4

Nếu bạn muốn kiểm tra xem cả hai tập hợp có chứa chính xác cùng một eleme không nts (có thể theo một thứ tự khác nhau), sau đó Array#every kết hợp với $.fn.index có thể thực hiện công việc:

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

Tôi nghĩ rằng bạn đang tìm kiếm $().is. Docs 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 

Sửa: @lolwut cung cấp một jsfiddle cho câu trả lời này. Sau khi đọc các ý kiến, tôi cập nhật nó và xác định rằng câu trả lời này không đáng tin cậy cho trường hợp của OP.

+1

Đây phải là câu trả lời đúng. – MacMac

+3

@lolwut, nope, 'is()' sẽ trả về 'true' nếu * ít nhất một trong các phần tử khớp với các đối số đã cho *. –

+0

Hãy xem [T.J. Nhận xét của Crowder] (http://stackoverflow.com/questions/9400500/how-do-i-check-if-2-jquery-selectors-are-pointing-to-the-same-elements/9401119#comment11878467_9400543) cho một giải thích tại sao điều này không hiệu quả. – Senseful

3

Là một giải pháp thay thế cho câu trả lời của pimvdb (rất hay, tôi chỉ cung cấp tính năng này cho đầy đủ), bạn có thể tận dụng thực tế là add() sẽ không thêm các phần tử đã có trong đối tượng jQuery.Do đó, bạn có thể viết:

$.fn.containsSameElements = function(other) { 
    var len = this.length; 
    return other.length == len && this.add(other).length == len; 
}; 
Các vấn đề liên quan