Вот что я в итоге придумал.
// 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);
}
Что касается последующего вопроса, я мог бы понять, как это можно легко обобщить, превратив его в функцию, которая принимает два аргумента: исходный элемент и строку фильтра - может ли кто-нибудь указать мне правильное направление, чтобы выяснить, как расширить объект jQuery для добавления такой функции?
Редактировать : С тех пор я обнаружил, что функция each () могла бы сделать это довольно хорошо для некоторых целей. В моем собственном случае это работает не так чисто, так как я хочу один объект jQuery для всех этих элементов, но вот как вы можете использовать каждый из них для разных целей (в этом примере скрывая последовательные элементы «.a»:)
$('#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');
}
}
-
Редактировать: Теперь я собрал это в плагин. Посмотрите на http://plugins.jquery.com/project/Adjacent, если вам интересно.