Хорошо, вот что я придумала - надеюсь, это будет полезно во многих различных ситуациях. Это 2 расширения jQuery, которые я называю prevALL
и nextALL
. В то время как стандарт prevAll()
соответствует предыдущим родным элементам, prevALL()
соответствует ВСЕМ предыдущим элементам вплоть до дерева DOM, аналогично для nextAll()
и nextALL()
.
Я постараюсь объяснить это в комментариях ниже:
// this is a small helper extension i stole from
// http://www.texotela.co.uk/code/jquery/reverse/
// it merely reverses the order of a jQuery set.
$.fn.reverse = function() {
return this.pushStack(this.get().reverse(), arguments);
};
// create two new functions: prevALL and nextALL. they're very similar, hence this style.
$.each( ['prev', 'next'], function(unusedIndex, name) {
$.fn[ name + 'ALL' ] = function(matchExpr) {
// get all the elements in the body, including the body.
var $all = $('body').find('*').andSelf();
// slice the $all object according to which way we're looking
$all = (name == 'prev')
? $all.slice(0, $all.index(this)).reverse()
: $all.slice($all.index(this) + 1)
;
// filter the matches if specified
if (matchExpr) $all = $all.filter(matchExpr);
return $all;
};
});
использование:
$('.myLinks').click(function() {
$(this)
.prevALL('.findme:first')
.html("You found me!")
;
// set previous nodes to blue
$(this).prevALL().css('backgroundColor', 'blue');
// set following nodes to red
$(this).nextALL().css('backgroundColor', 'red');
});
edit - функция переписана с нуля. Я просто подумал о гораздо более быстром и простом способе сделать это. Взгляните на историю редактирования, чтобы увидеть мою первую итерацию.
отредактируйте снова - нашли более простой способ сделать это!