jQuery нацеливается на каждого n-го брата элемента

У меня есть следующая разметка:

<div class="region">
<div class="award">
<div class="award">
<div class="region">
<div class="award">
<div class="award">
<div class="award">
<div class="award">
<div class="award">
<div class="award">

Как я могу настроить таргетинг на 3-й элемент после .region, чтобы получить что-то вроде этого?

<div class="region">
<div class="award">
<div class="award">
<div class="region">
<div class="award">
<div class="award">
<div class="award third">
<div class="award">
<div class="award">
<div class="award third">

Обратите внимание, что первые два элемента .award после первого .region не учитываются.

Заранее спасибо!


person itsututa    schedule 19.04.2012    source источник
comment
возможный дубликат stackoverflow.com/questions/1260277/addclass-every-nth   -  person Armatus    schedule 19.04.2012
comment
@Armatus: я так не думаю, не с разными отправными точками.   -  person T.J. Crowder    schedule 19.04.2012
comment
Эти элементы div должны быть родственными, верно? Вы их не закрыли, а это значит, что у вас там восемь слоев детей, но я уверен, что вы имели в виду не это...   -  person T.J. Crowder    schedule 19.04.2012
comment
@ T.J.Crowder Правда, небольшой разницы я не заметил. Пожалуйста, расценивайте мой комментарий как предложение для чтения идей в этом случае :)   -  person Armatus    schedule 19.04.2012


Ответы (1)


nextUntil в сочетании с eq должен сделать это:

$("div.region").each(function() {
    $(this).nextUntil(":not(.award)").eq(2).addClass("third");
});

Нет, немного сложнее обработать 6-й элемент:

$("div.region").each(function() {
    $(this).nextUntil(":not(.award)").filter(function(index) {
        return index % 3 == 2;
    }).addClass("third");
});

Живой пример | источник

Там мы берем каждый из .region элементов, доводим их братьев и сестер до первого, который не является .award (nextUntil) и filter из тех, что не являются каждым третьим.

(Не знаю, почему я использовал map в своем первая рабочая копия, filter имеет гораздо больше смысла.)

person T.J. Crowder    schedule 19.04.2012
comment
делая предположение, что каждый из div на самом деле не вложен и закрыт (плохая разметка в примере из OP), это не будет выбирать 10-й (последний) div в качестве второго 3-го элемента. - person Mark Schultheiss; 19.04.2012
comment
Да, я смотрел на оригинал, так как он казался недостаточным :) пришлось немного изучить его :) Отметьте этот как работающий сейчас. - person Mark Schultheiss; 19.04.2012
comment
@MarkSchultheiss: Да, я немного поморщился, когда делал живой пример. И я только что понял, что даже в исправлении я использовал map, где filter был бы более подходящим выбором, поэтому я исправил и это. - person T.J. Crowder; 19.04.2012
comment
Да, это лучше, но они оба работают. Интересно, что быстрее :) - person Mark Schultheiss; 19.04.2012
comment
@MarkSchultheiss: О, помашите красным флагом, почему бы и нет. ;-) Похоже на filter, что, вероятно, не должно нас удивлять: jsperf.com/silly-map -vs-фильтр - person T.J. Crowder; 19.04.2012