CodeSandBox:
https://codesandbox.io/s/onblur-bubble-preventiton-ngsdj?file=/src/App.js核心思路是利用 event.relatedTarget 这个属性来判断失焦是来自内部还是外部。代码如下:
import React, { useRef } from "react";
import "./styles.css";
export default function App() {
const outerRef = useRef();
return (
<div className="App">
<div
onBlur={(e) => {
// 失焦后获取焦点的那个元素
const nextFocusDom = e.relatedTarget;
// 判断其是否在父元素内,如果在父元素内就不错处理
if (nextFocusDom && outerRef.current.contains(nextFocusDom)) {
console.log(" [内部导致] 父元素失焦");
} else {
console.log(" [需要处理] [外部导致] 父元素失焦");
}
}}
className="outer"
ref={outerRef}
tabIndex="0"
>
<input className="inner" />
<select className="inner" />
</div>
<input />
</div>
);
}