2012-03-22 4 views
8

Вот моя скрипка: http://jsfiddle.net/jamesbrighton/wxWgG/4/JQuery выберите первый элемент, который имеет определенный класс после этого

HTML:

<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 


<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 

JQuery:

$('.click').click(function() { 
    $(this).nextAll('.target').css('color','red'); 
});​ 

мне это нужно так, когда вы нажимаете a p.click, следующий p.target становится красным.

Так что если вы нажмете на 'Click 1', то 'Target 1' станет красным. Если вы нажмете на 'Click 2', тогда 'Target 3' станет красным.

Как и .find Я пробовал .closest и из документации jQuery мне кажется, что он должен работать. Как вы можете видеть из HTML, .target не является дочерним по отношению к .click, если это имеет значение.

+0

nextВсе работы над братьями и сестрами, а не за ее родителями. Поэтому вам нужно рассказать нам, как вы хотите пройти. Если вы хотите, чтобы родители брали ребенка, тогда это возможно. –

+1

Ваш пример не очень хорош, он содержит только один элемент «Щелчок». Как связаны «Click» и «Target»? Являются ли они оба в порядке, то есть, если щелкнуть второй щелчок, нужно ли выделить вторую «Целевую» и т. Д.? * edit: * видимо вы связаны с неправильной скрипкой. Вот почему вы всегда должны включать код. –

+0

Я не вижу «Click 1» или «Click 2». Обновлен ли ваш код? –

ответ

11

Вот еще один подход, хотя я не знаю, как в этом случае работает .index(). Это также предполагает, что есть никогда не два последовательных .click элементы (или сформулированы по-разному: Существует всегда по крайней мере один .target элемент между двумя .click элементами):

var $elements = $('.click, .target'); 

$('.click').click(function() { 
    $elements.eq($elements.index(this) + 1).css('color','red'); 
});​ 

DEMO

Это работает, потому что элементы выбираются в порядок, который они отображают в документе.

+1

Умный и приятный. –

0

Вы не создадите конструкцию html для доступа к определенной цели. Мы можем достичь того, чего вы хотите, но сценарий будет усложняться, когда вы пройдете через такой путь. Вместо этого добавьте группу div, которая сделает ваш скрипт небольшим и легким.

DEMO

HTML:

<div class="group"> <!-- added grouping wrapper --> 
<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 
</div> 
<div class="group"> 
<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 
</div> 

JS:

$('.click').click(function() { 
    $(this).closest('.group').find('.target').css('color','red'); 
}); 

.nextAll работает на собрата. В вашем случае он будет искать всех родственников # click с классом .target.

Что вам нужно, это parents -> sibling -> child.

DEMO

$('#click').click(function() { 
    $(this).parent().siblings().find('.target').css('color','red'); 
}); 
+0

Только следующий '.target' должен быть красным. Это делает все «.target» красным – Ropstah

+0

Это работает, но он ломается, если я добавляю еще один div вокруг div, который продолжает p.click. Я думаю, я понимаю, почему это происходит, но есть ли способ найти следующий элемент с определенным классом, независимо от того, насколько он вложен? – Evans

0

Вы можете попробовать это.

$('#click').click(function() { 
    var go = true; 

    var item = $(this).parent(); 

    while(go && item) { 
     var target = $('.target', item)[0]; 

     if(target != null) { 
      go = false; 
      $(target).css('color', 'red'); 
     } 

     item = $(item).next()[0]; 
    } 
});​ 
3

Это выбирает элементы, необходимые в вашем HTML код:

$('.click').click(function() { 
    $(this).parent("div").next('div').find('.target').css('color','red'); 
});​ 
6

Вы ищете это?

$('.click').click(function() { 
    $(".target", $(this).parent().next()).css('color','red'); 
}); 

Updated Fiddle

+0

Это работает, но он ломается, если я добавляю еще один div вокруг div, который продолжает p.click. Я думаю, я понимаю, почему это происходит, но есть ли способ найти следующий элемент с определенным классом, независимо от того, насколько он вложен? – Evans

+2

Ваш HTML должен иметь фиксированную структуру или вам нужно четко определить, какие случаи вы хотите охватить. jQuery не может читать ум :) Пока вы можете определить макет, был бы способ, но определение должно быть последовательным и точным. –

1

на основе обновленной HTML, я создал эту скрипку: http://jsfiddle.net/wxWgG/22/

... и использовал JQuery

$('.click').click(function() { 
    $(this).parent().next().find('p.target').css('color','red'); 
});​ 

Это то, что вы хотели?

+0

Это работает, но он ломается, если я добавляю еще один div вокруг div, который продолжает p.click. Я думаю, я понимаю, почему это происходит, но есть ли способ найти следующий элемент с определенным классом, независимо от того, насколько он вложен? – Evans

+0

Ваш HTML в OP должен указать HTML, с которым вы хотите работать! См. Ответ Феликса Клинга - похоже, что он будет структурно-агностическим. В противном случае обновите OP и ожидайте еще один плот обновленных ответов .... – SpaceBison

Смежные вопросы