[英]On blur/focus events, how can you get blur not to fire if the next focus is in the same parent element?
我认为这个问题很直接。 代码如下。
<button onclick="toggleMenu()">Show Menu</button>
<div id="parent" class="hidden">
<input type="text"></input>
<input type="text"></input>
<input type="text"></input>
</div>
<script>
let parent = document.getElementById('parent');
parent.addEventListener('focus', function () {
// show parent
});
parent.addEventListener('blur', function () {
// hide parent
});
</script>
这个想法是parent
就像一个汉堡包菜单。 它有一个外部元素,您可以在其中切换它的可见状态。 出于可访问性原因,我想了解如何根据输入字段的焦点使其visible
或showing
。
这是可能吗?
上面的代码有效,但我担心onblur()
用户更改输入字段时都会调用onblur()
和onfocus()
。
您可以在 parent 上观看 mousedown 或 touchstart 事件。 如果我没记错的话,您可以检查父元素中是否包含目标元素,如果是,则阻止事件停止下一个事件,因此不会发生模糊。
该行为的主要缺点是操作不是在点击事件上触发的,用户不能只是取消它,将光标从按住鼠标按钮的菜单项移开。
为您要在模糊上执行的操作添加一些延迟,并根据您在焦点上设置的标志约束该操作:
let parent = document.getElementById('parent');
let focused = false;
parent.addEventListener('focus', function () {
focused = true;
console.log('show');
}, true);
parent.addEventListener('blur', function () {
focused = false; // reset the flag
setTimeout(function () {
if (focused) return; // cancel if another input focused after the blur
console.log('hide');
}, 100);
}, true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.