jQuery not: (это) исключить из класса все, кроме того, который был вызван в предыдущей функции

#javascript #jquery #this #slidetoggle

#javascript #jquery #это #slidetoggle

Вопрос:

Всем привет, у меня есть несколько скрытых разделов, которые отображаются с помощью динамической функции slideToggle. Все работает отлично, но divs остаются отображаемыми при нажатии на другие ссылки. Я бы хотел, чтобы одновременно отображался один div. Щелчок скрывает остальные и показывает новый. Кажется, я никогда не смогу корректно использовать полную функцию!

Спасибо, что уделили мне время! Я это безмерно ценю. Здесь просто маленький ребенок.

HTML:

     <div id="nav">
        <div class="menu"><a id="show_work">WORK</a></div>
            <div id="work" class="sub">
                <p>hidden content</p>
            </div>
        <div class="menu"><a id="show_biography">BIO</a></div>
            <div id="biography" class="sub" >
                <p>hidden content</p>
            </div>
        <div class="menu"><a id="show_contact">CONTACT</a></div>
            <div id="contact" class="sub">
                <p>hidden content</p>
            </div>
     </div>
  

Javascript, который работает, но оставляет их все открытыми:

 $('#work, #biography, #contact').hide();
$('#nav .menu').click(function() {
    $(this).next().slideToggle(400);
    return false;
}).next().hide();
  

Искаженный концептуальный Javascript того, что я хотел:

 $('#work, #biography, #contact').hide();
$('#nav .menu').click(function() {
    $(this).slideToggle(400);
    $('.sub not:(this)').slideUp(400);
});
return false;
});.next().hide();
  

Ответ №1:

Я бы просто написал функцию, которая скрывает все divs при любом нажатии:

 function hideDivs() {
  $(".menu div").hide();
}
  

Тогда ваши клики будут выглядеть следующим образом:

 $('#show_work').click(function() {
    hideDivs();
    $('#work').slideToggle(400);
});

$('#show_biography').click(function() {
    hideDivs();
    $('#biography').slideToggle(400);
});

$('#show_contact').click(function() {
    hideDivs();
    $('#contact').slideToggle(400);
});
  

Это работает, скрывая все divs, независимо от того, по какой ссылке был нажат. Вы могли бы скрыть нецелевые разделы вручную (показано ниже), но я думаю, что скрыть их все — хороший подход.

Альтернатива (более уродливая и менее обслуживаемая — также требуется логика, чтобы пропустить вызов slideToggle, если «показать div» уже виден):

 $('#show_work').click(function() {
    $('#show_biography, #show_contact').hide();
    $('#work').slideToggle(400);
});

$('#show_biography').click(function() {
    $('#show_work, #show_contact').hide();
    $('#biography').slideToggle(400);
});

$('#show_contact').click(function() {
    $('#show_work, #show_biography').hide();
    $('#contact').slideToggle(400);
});
  

Комментарии:

1. Похоже, что это мгновенно закрыло бы открытый элемент, а затем постепенно открыло бы новый. Выглядело бы немного странно. Разве вы не должны скользящим движением закрывать открытый элемент, одновременно открывая новый?

2. Да, вы могли бы скользить вместо того, чтобы скрывать — это было больше о концепции, чем о готовом продукте.

3. Это сработало, но немного неуклюже. Я обновил свой вопрос с помощью упрощенной функции. надеюсь, это поможет прояснить, что я ищу

Ответ №2:

Это то, что вы ищете?

 $('.sub').hide();
$('#nav .menu').click(function() {
    $('.sub:visible').not($(this).next()).slideUp(400);
    $(this).next().slideToggle(400);
    return false;
});
  

Вот скрипка, чтобы посмотреть, как это работает.

Ответ №3:

Комментарии:

1. круто! никогда не видел этого .. к сожалению, это всегда оставляет один из них открытым (я бы хотел начать со всех закрытых) и конфликтует с моим макетом (скрытые разделы не находятся непосредственно под соответствующей ссылкой). попробовал изменить это .. но это было недостаточно гладко. также происходила эта странная вещь с подсветкой.

2. @technopeasant Элемент управления accordion имеет опцию collapsible, которая позволяет закрывать все разделы. Но если это конфликтует с другими имеющимися у вас функциями, это не решит проблему.