You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现仅在div元素焦点移出到外部时触发onBlur事件?

问题原因

你遇到的问题是因为给div设置了tabIndex={0},让它变成了可聚焦的焦点元素。当你在div内部的按钮间切换TAB时,焦点会先离开div(触发div的onBlur),然后才进入下一个按钮——这是DOM事件的正常行为:父元素的blur事件会先于子元素的focus事件触发,只要焦点离开了div本身(哪怕是移到它的子元素上),都会触发div的blur回调。

解决方案

要实现仅在焦点移出div外部时触发函数,需要利用事件对象的relatedTarget属性,判断即将获得焦点的元素是否是当前div的后代元素。只有当新焦点不在div内部时,才执行你的逻辑。

修改后的代码如下:

export default function App() {
  const handleBlur = (e) => {
    // 检查即将获得焦点的元素是否不在div内部
    if (!e.currentTarget.contains(e.relatedTarget)) {
      console.log('Blur: 焦点已移出div外部');
    }
  };

  return (
    <>
      <div 
        onBlur={handleBlur} 
        style={{ padding: '20px', border: '1px solid #000'}} 
        tabIndex={0}
      >
        <button>1</button>
        <button>2</button>
      </div>
      <button>3</button>
    </>
  );
}
补充说明
  • e.relatedTarget:指向即将接收焦点的元素,如果焦点移出整个页面,这个值会是null。
  • currentTarget.contains(relatedTarget):判断新焦点元素是否是当前div的后代(包括div自身)。当relatedTarget为null时,contains(null)会返回false,此时也会触发逻辑,符合“焦点移出div”的预期。

内容的提问来源于stack exchange,提问作者LaysDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:01:15