2012-11-19 38 views
6

[sửa] Tôi đã viết lại câu hỏi và xóa ví dụ này, vì nó dường như gây nhầm lẫn cho bạn. Xin lỗi về rắc rối.Phù hợp với hậu duệ thứ bậc phù hợp với bộ chọn jQuery

Tôi cần khớp với hậu duệ đầu tiên khớp với công cụ chọn.

Nếu nhiều phần tử khớp với công cụ chọn này nhưng đang tách riêng cây (ví dụ: nếu một phần tử không phải là gốc của cây) thì tôi muốn chọn cả hai phần tử đó.

Cấu trúc DOM chính xác không được biết, vì vậy tôi không thể sử dụng các chức năng như .children() hoặc bộ chọn > (vì họ mong đợi người dùng chắc chắn về cấu trúc DOM thực tế).

Điều tôi cần thực sự giống như chức năng .closest(), nhưng đối với trẻ em phù hợp thay vì cha mẹ và có thể có nhiều trẻ em cùng một lúc.

+1

Nếu bạn có thể đảm bảo ID độc đáo , chắc chắn '$ ('# B'). tìm ('# C')' sẽ hoạt động? – BoltClock

+0

@BoltClock. Nhưng hr đã viết anh ta không thể, và tôi nghĩ bạn là jQuery và css master, tại sao bạn cần 'find' cho' id' selector ?! – gdoron

+0

@gdoron: Tôi chỉ dựa vào ví dụ '.find ('...')' của anh ấy. Anh ta cũng không nói rằng '# B' và' # C' * không * tồn tại trong mã thực, vì vậy tôi giả sử rằng chúng tồn tại, và ném một cái gì đó vào anh ta. Lý tưởng nhất là bạn sẽ có thể chỉ sử dụng '$ ('# C')' ... nhưng tôi đoán tôi không thực sự hiểu những gì đang xảy ra trong mã thực tế của OP. – BoltClock

Trả lời

1

Mọi cây bắt đầu từ #B được xác định bởi .children(); mỗi .foo đầu tiên trong một cây như thế là .find('.foo:eq(0)'), vì vậy bạn sẽ có thể sử dụng này:

$('#B').children(':not(.foo)').andSelf().find('.foo:eq(0)'); 
+0

Có một '.foo' đơn lẻ trong mã của riêng tôi, nhưng tôi tự hỏi nếu có cách nào phù hợp với mọi con đầu tiên' .foo', như trong [this] (http://jsfiddle.net/7gfFP/2 /) ví dụ (CCC và GGG nên được đánh dấu). –

+0

Giải pháp mới của bạn ('$ ('# B'). Children(). Find ('. Foo: eq (0)');') đang hoạt động (cái kia không, bởi vì bộ chọn con ngăn chặn nhiều mức độ imbrication) . Tuy nhiên, tôi không chắc chắn để hiểu tại sao '.find ('. Foo: eq (0)')' không trả về cùng một thứ '.find ('. Foo'). Eq (0)'. –

+0

Ok, tôi hiểu rồi, thực ra nó không hoạt động (nhưng gần như vậy!). Nó không thể khớp với '.foo' của con đầu tiên (trong [ví dụ này] (http://jsfiddle.net/7gfFP/4/), BBB cũng nên được đánh dấu). –

0

Bạn có thể sử dụng jQuery Plugin closestDescendant

Đó implemenst một bề rộng tìm kiếm đầu tiên, vì vậy kiểm tra của tất cả trẻ em của yếu tố hiện tại befor nó đi xuống cấp độ tiếp theo.

sau khi tải plugin hoặc thêm nó vào bạn mã nguồn mà bạn có thể đơn giản gọi nó theo cách này:

jQuery('#parent').closestDescendant(".selector", true) 

Ở đây bạn có thể tìm thấy một bản demo của hàm: demo closestDescendant

Các vấn đề liên quan