1
xiaoming1992 2021-01-13 19:27:51 +08:00
preventDefault ?
|
2
xiaoming1992 2021-01-13 19:31:14 +08:00
不过在`react 17`中改用了浏览器的`focusin`, `focusout`
|
3
xiaoming1992 2021-01-13 19:31:22 +08:00
|
4
hjylxmhzq 2021-01-13 22:41:55 +08:00
这种我一般用两个方法,一个是你说的全局监听 click,另一个是在 onBlur 中给一个 setTimeout,然后在同一个节点的 onFocus 中取消掉计时器
|
5
baxtergu 2021-01-14 11:47:10 +08:00 1
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> ); } |
6
baxtergu 2021-01-14 11:48:47 +08:00
MDN 上关于 relatedTarget 的解释: https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/relatedTarget
不同事件的 relatedTarget 不太一样 |
7
sillydaddy OP |