javascript - Jquery 没有关闭下拉菜单
问题描述
我正在使用 Bootstrap 导航栏构建多级(仅第二级)下拉菜单。我可以找到一个指南来构建多级下拉列表。
但是,下拉菜单不会在点击时关闭。可以通过单击关闭下拉菜单Document
,我已在下面添加jquery
。
$(document).click(function(){
$('.dropdown-menu').removeClass('show');
});
下拉菜单关闭,但是,当单击其他nav-item
打开的下拉菜单时,不会关闭。所以,JQuery
我缺少基本的。基本上,当单击 other 时,类show
不会从类中删除。所以,我想从.dropdown-menu
nav-item
show
.dropdown-menu
编辑:我正在寻找工作JS
或Jquery
代码,上面Jquery
是从 staoverflow 复制的损坏代码。所以,寻找完整和干净的解决方案
$('.dropdown-menu a.dropdown-toggle').on('click', function(e) {
if (!$(this).next().hasClass('show')) {
$(this).parents('.dropdown-menu').first().find('.show').removeClass('show');
}
var $subMenu = $(this).next('.dropdown-menu');
$subMenu.toggleClass('show');
return false;
});
$(document).click(function() {
// $('.dropdown-menu').toggleClass('show');
$('.dropdown-menu').removeClass('show');
});
$('.dropdown').click(function(event){
event.stopPropagation();
});
.dropdown-submenu {
position: relative;
}
.dropdown-submenu a::after {
transform: rotate(-90deg);
position: absolute;
right: 6px;
top: .8em;
}
.dropdown-submenu .dropdown-menu {
top: 0;
left: 100%;
margin-left: .1rem;
margin-right: .1rem;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
<nav class="navbar navbar-expand-md navbar-dark bg-primary py-1">
<div class="container-fluid">
<div class="flex-row d-flex">
<a class="navbar-brand" href="#">Brand</a>
</div>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dogs
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">Bulldog</a></li>
<li><a class="dropdown-item" href="#">Al</a></li>
<li><a class="dropdown-item" href="#">Labrador</a></li>
<li class="dropdown-submenu"><a class="dropdown-item dropdown-toggle" href="#">Puppies</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Husky</a></li>
<li><a class="dropdown-item" href="#">Husky B</a></li>
<li><a class="dropdown-item" href="#">Husky C</a></li>
</ul>
</li>
<li class="dropdown-submenu"><a class="dropdown-item dropdown-toggle" href="#">Pet Products</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Cat</a></li>
<li><a class="dropdown-item" href="#">Dogs</a></li>
<li><a class="dropdown-item" href="#">Reptile</a></li>
<li><a class="dropdown-item" href="#">Amphibian</a></li>
</ul>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Pet Cages
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">Cat</a></li>
<li><a class="dropdown-item" href="#">Dogs</a></li>
<li><a class="dropdown-item" href="#">Reptile</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Pet Guides
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">Labrador</a></li>
<li><a class="dropdown-item" href="#">Cat</a></li>
<li><a class="dropdown-item" href="#">Lizard</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
ML & AI
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">Pet CBD</a></li>
</ul>
</li>
<!-- <form class="d-flex"> -->
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<!-- <button class="btn btn-outline-success" type="submit">Search</button> -->
<!-- </form> -->
</ul>
</div>
</div>
</nav>
解决方案
对于持久性打开的DROPWON的主要问题,您可以通过侦听nav-link
事件来解决该问题show.bs.dropdown
,然后从.dropdown
包装中删除 show 类.dropdown-submenu
如下:
$('.nav-link').on('show.bs.dropdown', function(e) {
$(".dropdown-submenu .dropdown-menu").removeClass("show");
});
请参阅下面的工作片段:(也可以全屏尝试)
为了测试,我从片段中删除了一些菜单:
$('.dropdown-menu a.dropdown-toggle').on('click', function(e) {
if (!$(this).next().hasClass('show')) {
$(this).parents('.dropdown-menu').first().find('.show').removeClass('show');
}
var $subMenu = $(this).next('.dropdown-menu');
$subMenu.toggleClass('show');
return false;
});
$('.nav-link').on('show.bs.dropdown', function(e) {
$(".dropdown-submenu .dropdown-menu").removeClass("show");
});
$(document).on("click", ".nav-link", function(e){
console.log("clicl nav");
})
$('.dropdown').click(function(event) {
console.log("click");
event.stopPropagation();
});
.dropdown-submenu {
position: relative;
}
.dropdown-submenu a::after {
transform: rotate(-90deg);
position: absolute;
right: 6px;
top: .8em;
}
.dropdown-submenu .dropdown-menu {
top: 0;
left: 100%;
margin-left: .1rem;
margin-right: .1rem;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" />
<nav class="navbar navbar-expand-md navbar-dark bg-primary py-1">
<div class="container-fluid">
<div class="flex-row d-flex">
<a class="navbar-brand" href="#">Brand</a>
</div>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dogs
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">Bulldog</a></li>
<li><a class="dropdown-item" href="#">Al</a></li>
<li><a class="dropdown-item" href="#">Labrador</a></li>
<li class="dropdown-submenu"><a class="dropdown-item dropdown-toggle" href="#">Puppies</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Husky</a></li>
<li><a class="dropdown-item" href="#">Husky B</a></li>
<li><a class="dropdown-item" href="#">Husky C</a></li>
</ul>
</li>
<li class="dropdown-submenu"><a class="dropdown-item dropdown-toggle" href="#">Pet Products</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Cat</a></li>
<li><a class="dropdown-item" href="#">Dogs</a></li>
<li><a class="dropdown-item" href="#">Reptile</a></li>
<li><a class="dropdown-item" href="#">Amphibian</a></li>
</ul>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Pet Cages
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">Cat</a></li>
<li><a class="dropdown-item" href="#">Dogs</a></li>
<li><a class="dropdown-item" href="#">Reptile</a></li>
</ul>
</li>
<!-- <button class="btn btn-outline-success" type="submit">Search</button> -->
<!-- </form> -->
</ul>
</div>
</div>
</nav>
推荐阅读
- node.js - 无法通过node js发送电子邮件,尝试了几种方法
- python - python - 如何在一个参数中为python中的散射函数设置颜色和标记
- c - 任何人都可以详细解释以下c中的指针程序吗?
- php - 将字符串格式存储在db中的数据转换为对象日期时间
- apache - 导入 .war 文件时出现 Apache 错误。“错误:失败 - 无法启动上下文路径 [/文件夹] 处的应用程序”
- java - 如何转换复杂对象列表并将其表示为值 yaml 图表
- javascript - 在Javascript中使用Symbol.iterable进行迭代时如何检测当前元素是最后一个元素?
- linux - 并行运行命令,如果任何命令使用 wait 失败,则运行失败
- javascript - 显示数组中第一个值的函数,如果再次运行,显示数组的第二个值
- python - 如何在 Django 中获取过滤键和结果元组