Đây là những gì tôi nghĩ ra cuối cùng.
// here's our active element.
var $active = $('#active');
// here is the filter we'll be testing against.
var filter = "img.a";
// $all will be the final jQuery object with all the consecutively matched elements.
// start it out by populating it with the current object.
var $all = $active;
for ($curr = $active.prev(filter); $curr.length > 0; $curr = $curr.prev(filter)) {
$all = $all.add($curr);
}
for ($curr = $td.next(filter); $curr.length > 0; $curr = $curr.next(filter)) {
$all = $all.add($curr);
}
Đối với một câu hỏi theo dõi, tôi có thể thấy cách này dễ dàng có thể được khái quát hóa bằng cách làm cho nó thành một chức năng mà phải mất hai đối số: một yếu tố ban đầu, và một chuỗi lọc - bất cứ ai có thể chỉ cho tôi đi đúng hướng để tìm hiểu cách mở rộng đối tượng jQuery để thêm một hàm như vậy?
Sửa: Tôi đã kể từ khi phát hiện ra rằng mỗi() chức năng sẽ làm việc này khá tốt đối với một số mục đích. Trong trường hợp của riêng tôi, nó không hoạt động hiệu quả, vì tôi muốn một đối tượng jQuery cho tất cả các phần tử đó, nhưng đây là cách bạn có thể sử dụng cho mỗi mục đích khác nhau (ẩn các phần tử ".a" liên tiếp, trong ví dụ này :)
$('#active')
.nextAll()
.each(hideConsecutive)
.end()
.prevAll()
.each(hideConsecutive)
;
function hideConsecutive(index, element) {
var $e = $(element);
if (!$e.is(".a")) {
return false; // this stops the each function.
} else {
$e.hide('slow');
}
}
-
Edit: tôi đã đặt này lại với nhau thành một plugin bây giờ. Hãy xem http://plugins.jquery.com/project/Adjacent nếu bạn quan tâm.
Bạn có thể cung cấp một số đoạn mã hay không. Nó sẽ là hữu ích vì tôi đã không hoàn toàn nhận được những gì bạn có ý nghĩa. –