2016-10-15 3 views
0

Я полный любитель для кодирования; Я хочу иметь трехуровневое складное меню, которое будет расширяться при нажатии. Я нашел некоторый существующий код для использования, но он предназначен только для двухуровневого меню. Я не могу решить, как изменить скрипт, чтобы третий уровень открывался при нажатии. Любые идеи были бы больше всего оценили!Javascript трехуровневое складное меню

Вот существующий сценарий:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
 
    <!-- <script type="text/javascript" language="javascript" charset="utf-8" src="nav.js"></script> --> 
 
<!--[if lt IE 9]> 
 
    <script type="text/javascript" src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
 
<![endif]--> 
 

 

 
    <script> 
 
    $(document).ready(function(){ 
 
    $("#nav > li > a").on("click", function(e){ 
 
    if($(this).parent().has("ul")) { 
 
     e.preventDefault(); 
 
    } 
 

 
    if(!$(this).hasClass("open")) { 
 
     // hide any open menus and remove all other classes 
 
     $("#nav li ul").slideUp(350); 
 
     $("#nav li a").removeClass("open"); 
 
     
 
     // open our new menu and add the open class 
 
     $(this).next("ul").slideDown(350); 
 
     $(this).addClass("open"); 
 
    } 
 
    
 
    else if($(this).hasClass("open")) { 
 
     $(this).removeClass("open"); 
 
     $(this).next("ul").slideUp(350); 
 
    } 
 
    }); 
 
}); 
 
</script>

ответ

0

Вы можете достичь того же результата с относительно небольшим количеством кода по сравнению с тем, что у вас там.

Использование css для управления дисплеем, возможно, проще в управлении, поскольку javascript просто переключает класс, на который вы можете настроить таргетинг в своем CSS. Это также означает, что вы можете иметь столько уровней, сколько пожелаете.

Он работает за счет использования следующего селектора родственного в CSS +

$('.menu-trigger').click(function(){ 
 
    $(this).toggleClass('active') 
 
    
 
    // if you really wish to keep the jquery animation you can do this 
 
    // $(this).next('ul').slideToggle() 
 
})
/* you can use the sibling selector '+' to target the list */ 
 
.menu-trigger + ul { 
 
    display: none; 
 
} 
 

 
.menu-trigger.active + ul { 
 
    display: block; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li> 
 
    <a class="menu-trigger">parent</a> 
 
    <ul> 
 
     <li> 
 
     <a class="menu-trigger">child</a> 
 
     <ul> 
 
      <li> 
 
      <a class="menu-trigger">grandchild</a> 
 
      </li> 
 
     </ul> 
 
     </li> 
 
    </ul> 
 
    </li> 
 
</ul>

+0

Спасибо @ synthet1c - отлично работает! Хотя я бы предпочел избегать одновременного открытия более одного подменю (т. Е. Свернуть все остальные меню при щелчке). Я хорошо разбираюсь в подобных вопросах на этом сайте, но ни один из кодов не работает для меня. Есть ли у вас какие-либо советы? –

0

Я написал это, это просто, но вид иллюстрирует то, что вы хотите достичь.

$('li').hover(function(){ 
    $(this).children('ul:eq(0)').show(); 
}, function(){ 
    $(this).children('ul:eq(0)').hide(); 
}); 

http://codepen.io/clarenswd/pen/GjBaWp

+0

Спасибо @clarenswd - работает очень красиво, хотя я бы предпочел, чтобы подменю открывалось при нажатии, а не зависании - возможно ли это с помощью вашего кода? –

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