本文讲解如何在下拉菜单中为当前选中的选项添加 ✓ 标记,并自动移除其他选项的标记,确保始终仅有一个激活项显示勾选,支持默认选中首项及点击切换。
要实现“仅一个选项带 ✓、点击切换、默认首项已选中”的交互效果,关键在于统一管理所有选项的 checked 状态,而非为每个 单独绑定重复逻辑。原始代码存在多个问题:事件监听器未正确绑定到链接、event.target.classList.add('checked').innerText 语法错误、且未初始化默认选中状态。
以下是优化后的完整解决方案:
function dropdownCity() {
document.getElementById("myDropdownCity").classList.toggle("showCity");
}
// 初始化:默认为第一个选项添加 checked
document.addEventListener('DOMContentLoaded', () => {
const firstLink = doc
ument.querySelector('#myDropdownCity a');
if (firstLink) {
firstLink.classList.add('checked');
document.querySelector('.dropbtnCity').textContent = firstLink.textContent;
}
});
// 全局点击处理(委托更优,避免重复绑定)
document.addEventListener('click', function(event) {
const target = event.target;
if (target.matches('#myDropdownCity a')) {
event.preventDefault(); // 防止跳转锚点
// 关闭下拉框
document.getElementById("myDropdownCity").classList.remove("showCity");
// 更新按钮文本
const btn = document.querySelector('.dropbtnCity');
btn.textContent = target.textContent;
// 清除所有 .checked,仅给当前项添加
const allLinks = document.querySelectorAll('#myDropdownCity a');
allLinks.forEach(link => link.classList.remove('checked'));
target.classList.add('checked');
}
});.checked::after {
content: "✓";
margin-left: 8px; /* 推荐使用 margin-left 而非 flex 布局,避免干扰原有 display */
color: #2E7D32;
font-weight: bold;
}
/* 移除原 .checked::after 中 display:flex / justify-content 等无效属性(伪元素不支持 flex) */通过以上实现,下拉菜单将具备专业级单选行为:首次加载即高亮首项,点击任一选项后 ✓ 自动迁移,按钮文字实时同步,逻辑清晰、无冗余、可维护性强。