2012-02-20 12 views
5

Với cấu trúc HTML như sau:Đảm bảo hai mục là anh chị em trong JS/jQuery

<div class="wrap"> 
    <div id="a"></div> 
    <div id="b"></div> 
</div> 

sau đây là sai:

($('#a').parent() == $('#b').parent()); //=> false 

mặc dù:

$('#a').parent().children('#b').length; //=> 1 

bất cứ ai có thể giải thích tại sao? Cảm ơn!

Trả lời

6

Tôi không chính xác 100% lý do tại sao nó không hoạt động, nhưng tôi tin rằng đó là bởi vì các phần tử được bao bọc trong các đối tượng jQuery vốn vốn khác nhau trên mỗi phần tử.

Là một khắc phục, bạn có thể so sánh các đối tượng DOM bản địa, như thế này:

($('#a').parent()[0] == $('#b').parent()[0]); // true 

Example fiddle

+0

cảm ơn rất nhiều :) – abrad45

3

Bởi vì lý do tương tự mà $('#a) == $('#a')false

Mỗi lần jQuery builts một bộ của các phần tử, nó trả về một đối tượng mới (ngay cả khi đối tượng jQuery kết thúc tốt đẹp các phần tử giống nhau). Trong JavaScript, chỉ chỉ thời gian một đối tượng bằng với đối tượng khác, là nếu nó chính xác là cùng một đối tượng;

var a = { 
    foo: 1 
}; 
var b = { 
    foo: 1 
}; 

(a == b) // false; 

Để sửa lỗi này, bạn có thể so sánh các đối tượng DOM trực tiếp (hoặc bằng cách sử dụng .get(i) hoặc sử dụng các đối tượng jQuery như một mảng ([i])), hoặc bạn sẽ có được sử dụng phương pháp is();

if ($('.foo').get(i) == $('.bar').get(i)); 
if ($('.foo')[0] == $('.bar')[0]); 
if ($('.foo').is($('.bar')); // or even... 
if ($('.foo').is('.bar')); 
+2

'$ ('. Foo'). Is ('. Bar')' là đủ. –

+0

cảm ơn lời giải thích! – abrad45