Dropdown下拉菜单点击后不消失怎么办?
我用原生JS写了个简单的下拉菜单,点击按钮显示菜单没问题,但点菜单项之后下拉框不自动收起,得再点别处才行。这体验太差了,咋解决啊?
我试过在菜单项的点击事件里加 dropdown.classList.remove('show'),但有时候会和其他逻辑冲突,比如需要先处理选中状态再关闭。
document.querySelector('.dropdown-btn').addEventListener('click', () => {
dropdown.classList.toggle('show');
});
document.querySelectorAll('.dropdown-item').forEach(item => {
item.addEventListener('click', () => {
// 这里想关掉下拉,但有时会提前关闭导致数据没更新
dropdown.classList.remove('show');
});
});
解决办法是用
setTimeout把关闭操作延迟到下一个事件循环,这样当前事件里的所有逻辑都执行完后再关下拉框:setTimeout(..., 0)会把回调放到任务队列末尾,等当前执行栈清空、DOM更新完成后再执行,这样就不会冲突了。如果你用的是现代浏览器,还有个更优雅的方式是用
requestAnimationFrame,效果类似但更符合浏览器渲染时机:两种方式都能解决你那个"数据没更新就关闭"的问题,看你喜好选一个就行。