focus blur 事件

2022-11-28 15:08:33

目录前言触发场景使用tabIndex使非表单元素支持focus和blur事件不支持冒泡支持捕获react中的focus和blur支持冒泡前言在浏览器中表单元素天然支持focus和blur事件,这两个事...

目录
前言
触发场景
使用tabIndex使非表单元素支持focus和blur事件
不支持冒泡
支持捕获
react中的focus和blur支持冒泡

前言

在浏览器中表单元素天然支持focus和blur事件,这两个事件在开发过程中出现的频率还是挺高的,前端开发者也都比较熟悉,在这里特意总结一下。

触发场景

鼠标点击


键盘tab键


直接调用dom的focus,blur方法


使用tabIndex使非表单元素支持focus和blur事件

给一个普通的div元素增加tabIndex属性后,这个元素就能支持focus和blur事件了。可以设置tabIndex为-1,这样元素既可以被focus,同时不会被键盘访问到。

<div id="d1" tabindex="-1">
    1111
</div>
<script>
  const d1 = document.querySelector('#d1');
  d1.addEventListener('focus', function () {
    console.log('d1 focus') // 会触发focus
  })
</script>

不支持冒泡

下面的例子中我们期待focus<input />的时候会触发div的focus事件,然而事与愿违,原因就是focus事件不支持冒泡

&lt;div id="d1" tabindex="-1"&gt;
    原生 &lt;input id="d2" /&gt;
    1111
&lt;/div&gt;
&lt;script&gt;
  const d1 = document.querySelector('#d1');
  d1.addEventListener('focus', function () {
    console.log('d1 focus') // 不会触发focusjs
  })
&lt;/script&gt;

支持捕获

&lt;div id="d1" tabindex="-1"&gt;
    原生 &lt;input id="d2" /&gt;
    1111
&lt;/div&gt;
&lt;script&gt;
  const d1 = document.querySelector('#d1');
  d1.addEventListener('focus', function () {
    console.log('d1 focus') // 会触发focus
  }, {capture: true})
&lt;/script&gt;

react中的focus和blur支持冒泡

这就很有意思了,原因是react中使用js合成事件,自己完成了一套冒泡逻辑。

&lt;div id="root"&gt;&lt;/div&gt;
&lt;script src="https://cdn.bootcdn.net/AJAX/libs/react/16.11.0/umd/react.production.min.js"&gt;&lt;/script&gt;
&lt;script src="https://cdn.bootcdn.net/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"&gt;&lt;/script&gt;
&lt;script src="https://unpkg.com/@babel/standalone@7.18.4/babel.min.js"&gt;&lt;/script&gt;
&lt;script type="text/babel"&gt;
  class App extends React.Component {
    focus=()=&gt; {
      console.log('div focus') // 会触发focus
    }
    inputFocus=()=&gt;{
      console.log('input focus') // 会触发focus
    }
    render() {
      return &lt;div onFocus={thpythonis.focus}  &gt;
        react &lt;input onFocus={this.inputFocus} /&gt;
      &lt;/div&gt;
    }
  }
  window.onload = function () {
    ReactDOM.render(&lt;App /&gt;, document.querySelector('#root'))
  }
&lt;/script&gt;

以上就是focus blur 事件的详细内容,更多关于focus blur 事件的资料请关注我们其它相关文章!