有一个固定的div,有一些链接,当用户单击按钮时显示。为了便于访问,我想在这个div失去键盘焦点时关闭它,但是我找不到要处理的正确的DOM事件。
我尝试过blur
和focusout
事件,但即使在子元素仍然具有焦点时也会触发它们。
示例:
function openMenu() {
var menu = document.getElementById("menu");
menu.setAttribute("open", "");
menu.addEventListener("focusout", handleMenuFocusOut);
menu.focus();
}
function closeMenu() {
var menu = document.getElementById("menu");
menu.removeAttribute("open");
}
function handleMenuFocusOut() {
console.log("Event triggered!");
menu.removeEventListener("focusout", handleMenuFocusOut);
closeMenu();
}
#menu {
display: none;
position: fixed;
top: 50px;
padding: 20px;
background-color: gray;
}
#menu[open] {
display: block;
}
#menu:focus, a:focus {
background-color: cyan;
}
<div>
<button onclick="openMenu()">Click Me</button>
<div id="menu" tabindex="0">
<ul>
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
</ul>
</div>
<input type="text"/>
</div>
若要再现该案例,请单击该按钮并按下选项卡以在链接之间导航。预期的行为是只在聚焦外部元素(如textbox )时关闭div。
发布于 2021-09-07 02:29:34
好吧,我完全改变了这个答案。
您可以使用纯CSS使用focus-within
和~
(在打开按钮聚焦时用来显示菜单)。
看一下这个片段,它不使用JS:
#menu {
display: block;
position: fixed;
top: 50px;
padding: 20px;
background-color: cyan;
opacity: 0;
pointer-events: none;
}
*:focus { outline: 3px solid #ff0; }
#menu:focus-within, #open-btn:focus ~ #menu {opacity: 1; pointer-events: all;}
<div>
<button id="open-btn">Click Me</button>
<div id="menu" tabindex="0">
<ul>
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
</ul>
</div>
<input type="text" />
</div>
https://stackoverflow.com/questions/69086330
复制相似问题