如何使用 javascript 打开和关闭子菜单

How to click on and off submenu's using javascript

我对 javascript 和一般的 Web 开发还很陌生。我目前正在尝试让我的侧边栏导航区域中的子菜单弹出以响应 onclick 事件。我可以用一些多余的 javascript 单独打开我的子菜单,因为我不知道如何用循环来做(如果那是最好的方法)。但即使我走到这一步,我也想不出关闭它们的最佳方法。这是我的 HTML 用于侧边栏导航

                   <ul id="sidebarNavUl">

                       <li class="sidebarLi">Main Topic:
                           <ul>
                                <li><a href="#">Sub Topic</a></li>
                           </ul> 
                       </li>

                       <li class="sidebarLi">Main Topic:
                           <ul>
                                <li><a href="#">Sub Topic</a></li>
                           </ul> 
                       </li>

                      <li class="sidebarLi">Main Topic:
                           <ul>
                                <li><a href="#">Sub Topic</a></li>
                           </ul> 
                       </li>

                   </ul>

               </nav>

还有我的CSS:

.sidebarLi ul {
    padding-left: 10px;
    position: absolute;
    right: 9000em;

}

.sidebarLi ul li a {
    color: #003354;
}

.sidebarLi ul li a:hover {
    color: #003354;
    padding: 0 10px;
    width: auto;
    height: auto;
    background-color: #edf3f6;
    border-radius: 5px;
}

请注意,我正尝试从我的子菜单的绝对位置开始,而我的 javascript 我计划插入一个内联样式以将它们带回静态位置,因为每个主题都堆叠在一个之上另一个,我希望它们在单击时展开(因为在绝对位置上它们不是正常文档流的一部分)。我还将它们移动到右侧 9000 em,而不是隐藏它们以使屏幕阅读器可以看到它们。因此,如果有人可以帮助我编写好的 javascript 代码以在单击时将子菜单带入和带出,将不胜感激。谢谢你。

如果您想知道这是 javascript 我想写的:

var mainSidebarLi = document.getElementsByClassName("sidebarLi");


mainSidebarLi[0].onclick = function () {

   mainSidebarLi[0].getElementsByTagName("ul")[0].style.position = "static";
   mainSidebarLi[0].getElementsByTagName("ul")[0].style.right = "0";

};

var mainSidebarLi = document.getElementsByClassName("sidebarLi");


mainSidebarLi[1].onclick = function () {

   mainSidebarLi[1].getElementsByTagName("ul")[0].style.position = "static";
   mainSidebarLi[1].getElementsByTagName("ul")[0].style.right = "0";

};

所以这个过程会重复,直到我得到 li 数组中的所有元素。

有几种方法可以解决这个问题。一种简单的方法是使用 jQuery toggleClass。向 ul 标签添加一个活动的 class 并在点击事件中切换 class。

添加此 CSS 样式:

.sidebarLi ul.active {
position:relative;
left: 0;    

}

添加这个 jQuery:

$('#sidebarNavUl li').click(function() {
$(this).children('ul').toggleClass('active');
});

如果您不熟悉添加 JQuery - 只需在 </body> 标签之前添加:

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>
$('#sidebarNavUl li').click(function() {
$(this).children('ul').toggleClass('active');
});
</script>

另一个线程的另一个答案,如果你想在 li 标签中使用标签:

$('.expandingNav').on('click', function (e) {
    if ($(e.target).closest('ul').parent('nav.sidebar').length) {
        if ($(this).hasClass('expanded')) {
            $(this).children('.hidden').slideUp();
            $(this).removeClass('expanded');
        } else {
            $(this).children('.hidden').slideDown();
            $(this).addClass('expanded');
        }
    }
});

fiddle