javascript - 点击任意位置关闭下拉菜单
问题描述
所以我有下面的代码可以点击下拉菜单并打开它们,但是当我点击另一个下拉菜单时,它不会关闭前一个 - 如何调整我的 JS 代码以关闭前一个下拉菜单并保留当前下拉菜单只开放?
function dropdowns() {
var dropdowns = document.querySelectorAll('.dropdown:not(.is-hoverable)');
if (dropdowns.length > 0) {
dropdowns.forEach(function (el) {
el.addEventListener('click', function (event) {
event.stopPropagation();
el.classList.toggle('is-active');
});
});
document.addEventListener('click', function (event) {
closeDropdowns();
});
}
function closeDropdowns() {
dropdowns.forEach(function (el) {
el.classList.remove('is-active');
});
}
}
<link href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css" rel="stylesheet"/>
<div class="dropdown is-clickable">
<div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
<span>Dropdown button</span>
<span class="icon is-small">
<i class="fas fa-angle-down" aria-hidden="true"></i>
</span>
</button>
</div>
<div class="dropdown-menu" id="dropdown-menu" role="menu">
<div class="dropdown-content">
<a href="#" class="dropdown-item">
Dropdown item
</a>
<a class="dropdown-item">
Other dropdown item
</a>
<a href="#" class="dropdown-item is-active">
Active dropdown item
</a>
<a href="#" class="dropdown-item">
Other dropdown item
</a>
<hr class="dropdown-divider">
<a href="#" class="dropdown-item">
With a divider
</a>
</div>
</div>
</div>
解决方案
在事件处理程序中closeDropdowns()
切换类之前调用。is-active
function dropdowns() {
var dropdowns = document.querySelectorAll('.dropdown:not(.is-hoverable)');
if (dropdowns.length > 0) {
dropdowns.forEach(function (el) {
el.addEventListener('click', function (event) {
event.stopPropagation();
closeDropdowns(); // <== HERE
el.classList.toggle('is-active');
});
});
document.addEventListener('click', function (event) {
closeDropdowns();
});
}
function closeDropdowns() {
dropdowns.forEach(function (el) {
el.classList.remove('is-active');
});
}
}
但是,您应该添加一个检查以测试下拉列表当前是否打开,如果是,请跳过切换类,因为这将关闭并再次打开它。
el.addEventListener('click', function (event) {
const isActive = el.classList.contains('is-active');
closeDropdowns();
if (!isActive) {
el.classList.toggle('is-active'); // or simply el.classList.add('is-active');
}
event.stopPropagation();
});
推荐阅读
- javascript - Ruby on Rails - 您能否仅使用 jsPDF 将“html.erb”视图生成为可下载的 PDF?
- dart - 在飞镖中解码 JSON
- php - 使用 PHP 从标签名中带有冒号的 RSS 提要获取附件标签
- python - 如何从字典中为 LogisticRegression 赋值?
- tabs - 标签/手风琴内的jQuery同位素
- rust - 定义结构时如何使用特征中的常量?
- python - 为什么 Firebase 说我的应用既不存在又已经同时存在?
- java - Android.java 到 Servlet.java 通过 HttpURLConnection 的连接错误
- database - 在我的数据库中下载 twilio 记录 #10
- c++ - 在后台运行外部可执行文件并拦截流