#jquery #navigation #slidedown #slideup
#jquery #навигация #слайд-шоу #выдвижной
Вопрос:
я использую эту структуру html:
<div id="products">
<ul>
<li class="selected"><a href="#">Item 1</a>
<ul>
<li><a href="#">Sub-Item 1 a</a></li>
<li><a href="#">Sub-Item 1 b</a></li>
<li><a href="#">Sub-Item 1 c</a></li>
</ul>
</li>
<li><a href="#">Item 2</a>
<ul>
<li><a href="#">Sub-Item 2 a</a></li>
<li><a href="#">Sub-Item 2 b</a></li>
</ul>
</li>
<li><a href="#">Item 3</a>
<ul>
<li><a href="#">Sub-Item 3 a</a></li>
<li><a href="#">Sub-Item 3 b</a></li>
<li><a href="#">Sub-Item 3 c</a></li>
<li><a href="#">Sub-Item 3 d</a></li>
</ul>
</li>
<li><a href="#">Item 4</a>
<ul>
<li><a href="#">Sub-Item 4 a</a></li>
<li><a href="#">Sub-Item 4 b</a></li>
<li><a href="#">Sub-Item 4 c</a></li>
</ul>
</li>
</ul>
</div>
и этот код jquery:
$(document).ready(function () {
$("#products li").click(function() {
if ($(this).attr('class') != 'selected') {
$('#products li').removeClass('selected');
$(this).addClass('selected');
}
});
$("#products li").click(function() {
$('#products li ul').slideUp();
$('#products li.selected ul').slideDown();
});
});
Проблема:
я хочу, чтобы эффект скольжения вверх и вниз действовал только на элементы первого уровня (< li >), а не на подпункты
другая проблема — если элемент списка уже class =»выбран», и вы нажимаете на него, он скользит вверх, а затем снова вниз .. (ничего не должно произойти, если он уже есть)
кто-нибудь может помочь с кодом jquery?
Ответ №1:
Попробуйте это:
Демонстрация: http://jsfiddle.net/LEdgT/6/
$(document).ready(function () {
$("#products > ul > li").click(function() {
if ($(this).has('ul')) {
if ($(this).hasClass('selected')) {
$(this).removeClass('selected')
.find('ul').slideUp();
}
else {
$(this).addClass('selected')
.find('ul').slideDown();
}
}
});
});
Ответ №2:
Измените свой селектор на $('#products > ul > li')
, он будет выбирать только непосредственных дочерних элементов.
Или вы могли бы изменить весь код на что-то более читаемое и менее повторяющееся:
var $topLevelItems = $("#products > ul > li");
$topLevelItems.click(function() {
if (!$(this).hasClass('selected')) {
$topLevelItems.removeClass('selected')
.find('ul')
.slideUp();
$(this).addClass('selected')
.find('ul')
.slideDown();
}
});
Ответ №3:
Вы можете сделать это с :not
помощью селектора или .not
$('#products > li:not(.selected)').click(function() {
$('#products li ul').slideUp();
$('#products li.selected ul').slideDown();
});