最近在用 react 实现事件响应时,用到了元素的 onBlur()回调方法。
onBlur()是写在某个 react 父元素上的,这个父元素包含了多个子元素。
<div tabIndex={-1} OnBlur={onBlurParent}>
<Select>...</Select>
<Input>...</Input>
</div>
想要实现的效果就是:焦点不在父元素**并且**不在子元素上时,切换父元素的显示状态。
但结果是在子元素之间点击时,就触发了 onBlurParent(),很明显不是我想要的效果。
为此查找了网上的资料(请原谅我的初学无知),了解到了“事件冒泡”和“事件捕获”这两个事件模型。所以大概知道了发生了什么:
html 原生的事件模型中,blur 和 focus 事件不支持冒泡,然后 react 实现了它们的冒泡,结果导致在子元素之间切换焦点时,blur 事件冒泡到了父元素,触发了 onBlurParent()。
我能想到比较笨的法子来解决这个问题(记录父子元素的 focus 状态,配合全局的 click 事件),不知道大家遇到这种情况是怎么处理的呢?
(另外,我看到网上有说法( https://imweb.io/topic/5b67e61df3fbd8d9125fe801 )是,“一方面从历史沿革来看,在浏览器的早期,Netscape 浏览器是使用的 capture 事件模型,而 IE 使用的是冒泡模型,后来的标准里面就有了这两种模型可选”,感觉不太相信,仅仅是为了兼容? 有没有比较好的这方面相关的资料呢? )
onBlur()是写在某个 react 父元素上的,这个父元素包含了多个子元素。
<div tabIndex={-1} OnBlur={onBlurParent}>
<Select>...</Select>
<Input>...</Input>
</div>
想要实现的效果就是:焦点不在父元素**并且**不在子元素上时,切换父元素的显示状态。
但结果是在子元素之间点击时,就触发了 onBlurParent(),很明显不是我想要的效果。
为此查找了网上的资料(请原谅我的初学无知),了解到了“事件冒泡”和“事件捕获”这两个事件模型。所以大概知道了发生了什么:
html 原生的事件模型中,blur 和 focus 事件不支持冒泡,然后 react 实现了它们的冒泡,结果导致在子元素之间切换焦点时,blur 事件冒泡到了父元素,触发了 onBlurParent()。
我能想到比较笨的法子来解决这个问题(记录父子元素的 focus 状态,配合全局的 click 事件),不知道大家遇到这种情况是怎么处理的呢?
(另外,我看到网上有说法( https://imweb.io/topic/5b67e61df3fbd8d9125fe801 )是,“一方面从历史沿革来看,在浏览器的早期,Netscape 浏览器是使用的 capture 事件模型,而 IE 使用的是冒泡模型,后来的标准里面就有了这两种模型可选”,感觉不太相信,仅仅是为了兼容? 有没有比较好的这方面相关的资料呢? )
