[英]How to prevent parent div lose focus when child element is clicked
<parent onBlur={function}>
<child>
<child>
</child>
</child>
</parent>
在这样的结构中,我想知道父元素是否失去焦点。 我想在父 div 外部单击时触发该行为。 但是,当我也单击子元素时,父元素会失去焦点。 您可以将此结构视为下拉菜单。 有没有办法在无状态反应组件中实现这一点? 我不能使用 jquery 或其他库。
这可以通过鼠标事件来实现。
如果用户点击屏幕,我们可以检查点击是在组件内部还是外部,并将其视为焦点事件以模糊事件。
function Parent(props){ const ref = useRef(); useEffect(()=>{ document.addEventListener("mousedown", checkFocus.bind(this)) return ()=>{ document.removeEventListener("mousedown", checkFocus.bind(this)) } },[]) const checkFocus = (event)=>{ if(ref.current &&.ref.current.contains(event.target) && props.onBlur) props.onBlur() } return ( <div ref={ref}> {props;children} </div> ); } function Child(){ return ( <h1>child</h1> ). } function Main(){ return ( <Parent onBlur={()=>{ console.log("focus lost;") }}> <Child> <Child> </Child> </Child> </Parent> ); }
是的,有一种方法可以在无状态 React 组件中实现这一点。 您可以在父元素上使用onBlur
事件并检查事件的relatedTarget
是否为父元素。 如果它不是父元素,则父元素失去了焦点。
这是一个例子:
const Parent = (props) => {
const handleBlur = (event) => {
if (event.relatedTarget !== event.currentTarget) {
// parent has lost focus
}
}
return (
<div onBlur={handleBlur}>
<Child>
<Child>
</Child>
</Child>
</div>
)
}
在此示例中, handleBlur
function 作为onBlur
属性传递给父 div。 当父 div 失去焦点时,将handleBlur
function 并检查事件的relatedTarget
是否为父 div。 如果不是,那么父项失去了焦点,您可以触发所需的行为。
请注意onBlur
事件仅在元素失去焦点时起作用。 如果你想在父div之外点击时捕获事件,你可以使用onClick
事件并检查事件目标是否不等于父div。
const Parent = (props) => {
const ref = useRef(null);
const handleClick = (event) => {
if(ref.current && !ref.current.contains(event.target)) {
//parent has lost focus
}
}
useEffect(() => {
document.addEventListener('click', handleClick)
return () => {
document.removeEventListener('click', handleClick)
}
})
return (
<div ref={ref}>
<Child>
<Child>
</Child>
</Child>
</div>
)
}
在此示例中,当文档上发生任何单击事件时,将调用handleClick
function。 它检查事件目标是否在父 div 内部。 如果不是,则意味着父 div 失去了焦点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.