javascript - 使用 Vanilla JavaScript 防止多个 EventListener 发生焦点冲突
问题描述
我正在扩展我现有的导航以实现可访问性,但是在目标集中时按键盘上的“Enter”时出现问题。当任何其他元素被聚焦时,搜索和/或导航切换的事件监听器会触发,这可以是任何锚点或任何聚焦元素。
鼠标单击单个元素(并单击表单)以它需要的方式起作用。但是,在焦点上然后在页面上的任何位置点击“Enter”,它会触发(如果不是正确的)这两个事件。任何帮助,将不胜感激。
/* Search */
let searchToggle = document.querySelector('.search-toggle'),
searchForm = document.querySelector('.search-form');
function searchClick(event) {
event.stopPropagation();
let toggled = searchToggle.contains(event.target);
if (toggled) {
searchForm.classList.add('show-search-form');
} else if (!event.target.closest('.show-search-form')) {
searchForm.classList.remove('show-search-form');
}
}
function searchFocus(event) {
if (event.keyCode === 13) {
event.stopPropagation();
searchToggle.click();
}
}
document.addEventListener('click', searchClick, false);
document.addEventListener('keyup', searchFocus, false);
/* Navigation */
let navToggle = document.querySelector('.toggle'),
nav = document.querySelector('.nav');
navToggle.addEventListener('click', () => {
nav.classList.toggle('toggle-menu');
});
function navFocus(event) {
if (event.keyCode === 13) {
event.stopPropagation();
navToggle.click();
}
}
document.addEventListener('keyup', navFocus, false);
*:focus-visible {
outline: 5px solid #333333;
}
.search-form,
.nav {
display: none;
}
.search-form.show-search-form {
display: block;
}
.nav.toggle-menu {
display: block;
}
<div class="search-toggle" tabindex="0">
<span>Toggle Search</span>
</div>
<div class="search-form">
<span>Test Form</span>
</div>
<div class="toggle" tabindex="0">
<span>Toggle Menu</span>
</div>
<nav class="nav">
<ul>
<li><a href="#">Test</a></li>
<li><a href="#">Test</a></li>
<li><a href="#">Test</a></li>
</ul>
</nav>
解决方案
推荐阅读
- javascript - 在 D3 和 Plotly 中处理和处理数据
- python - 从数据框单元格列表中的列表中搜索值并添加另一列与结果
- java - Java 数组输出格式
- python - 存储列表和字典中的值
- mysql - 如何在 CTE 上的 MySQL 中运行更新查询?
- javascript - 如何检查字符串中是否包含数字
- android - 如何为 Unity 项目运行 AppsFlyer SDK 集成测试?
- laravel - 错误: Composer\Downloader\TransportException 我尝试安装 Laravel
- java - 如何将 csv 文件转换为 ByteArrayResource
- c++ - 编译器是否被迫根据模板参数评估 if 表达式?