2013-08-07 5 views
3

я получил эту структуру:эффективный способ для выбора

<ul class="depth-one"> 
    <li>Category 1 <span class="do">+</span> 
     <ul class="depth-two"> 
      <li > Category 1.1 <span class="do">+</span> 
       <ul class="depth-three"> 
        <li>Category 1.2.1</li> 
        <li>Category 1.2.2</li> 
       </ul> 
      </li> 
      <li> Category 1.2</li> 
      <li> Category 1.3</li> 
     </ul> 
    </li> 
    <li> Category 2 <span class="do">+</span> 
     <ul class="depth-two"> 
      <li>Category 2.1</li> 
      <li>Category 2.2</li> 
      <li>Category 2.3</li> 
     </ul> 
    </li> 
    <li>Category 3 <span class="do">+</span> 
     <ul class="depth-two"> 
      <li>Category 3.1</li> 
      <li>Category 3.2</li> 
      <li>Category 3.3</li> 
     </ul> 
    </li> 
</ul> 

с этим CSS:

ul{ 
    list-style:none; 
    padding:0; 
    margin:0; 
} 
ul li{ 
    width:220px 

} 
.depth-one{ 

} 
.depth-two{ 
    display:none; 
} 
.depth-three{ 
    display:none; 
} 

.do{ 
    float:right; 
    font-weight:bold; 
    color:blue; 
    cursor:pointer; 
} 

То, что я хочу сделать, это всякий раз, когда я нажимаю на классе «делать» (пролетов) Я хотел бы переключить элемент UL шкафа.

Как я могу выбрать элемент UL шкафа для span с помощью jQuery, поэтому я могу использовать функции slideUp и slideDown для его переключения?

Моя идея заключалась в использовании функции next(), но я думаю, что существует более общий способ сделать это.

Заранее благодарен!

+0

Что вы имеете в виду более общий характер? Чем меньше общий метод, тем лучше, но если вы хотите каким-то образом сохранить ваш DOM более универсальным, вы можете использовать:. .nextAll ('ul') 'или' .siblings ('ul') '. Вы можете комбинировать этот метод с '.first()' зависимым случаем использования и DOM –

+0

Использовать метод eQuery eq и передать ему индекс. Он уменьшает набор согласованных элементов до единицы по указанному индексу. –

ответ

5

Ну, .next() на самом деле идеально

$('.do').on('click', function() { 
    $(this).next('ul').slideToggle().find('ul:visible').slideUp(); // According to your comment; hide all the visible successors of type ul. 
    $(this).text($(this).text() == '+' ? '-' : '+'); // Alter the caption (which I guess you want to do as well) :-) 
}); 

EDIT: Добавлено скрытие для всех дочерних ул, совпадающее Ваш комментарий.

+0

Хорошо, угадайте, есть другой способ, чем использовать следующую функцию() :-) Ваше решение работает отлично, но есть одна небольшая проблема, если я разворачиваю категорию 1, а затем разворачиваю категорию 1.1, а затем ЗАКРЫВАЮ категорию 1, а затем повторно открыть категорию 1, категория 1.1 все еще открыта. скрипка: http://jsfiddle.net/uXA7E/ – kfirba

+1

@kfirba Как правило, вы должны поместить этот комментарий в свой вопрос, который будет немного яснее –

+0

Я вижу, так что я должен отредактировать свой пост? или открыть новую запись? – kfirba

3

Вы можете использовать .next() метод JQuery

Пример:

$(".do").click(function() { 
    $(this).next("ul").slideToggle() 
}); 
+0

не отличается от ответа Эрика, нет необходимости публиковать его IMO –

+0

Извините, ответа Эрика не было, когда я начал, но я отвлекся на полпути, набрав его –

+0

Так что все в порядке, я знаю, что вы имеете в виду;) –

0

Попробуйте

$(".do").click(function() { 
    $(this).next().closest("ul").slideToggle(); 
}); 

FIDDLE

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