前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >focus/focusin/focusout

focus/focusin/focusout

作者头像
公众号@魔术师卡颂
发布2020-08-26 23:37:23
6820
发布2020-08-26 23:37:23
举报
文章被收录于专栏:魔术师卡颂魔术师卡颂

速答:

focusinfocusout事件会冒泡。

focusblur事件不会冒泡。


什么元素能够focus

默认情况并不是所有元素都能获得焦点。需要满足以下条件之一:

  • 可交互的元素(如 input,select,a)。换言之,默认情况下,用于布局的元素(如div, span, table)则不能获得焦点
  • 含有tabindex属性的元素

当我们想令非可交互元素获得焦点,可以为其设置tabindex属性。

tabindex属性

tabindex属性接收一个number作为参数,代表按下键盘Tab键时focus元素切换的顺序。

他的规则如下:

  • tabindex大于等于1,切换时按tabindex从小到大的顺序
  • tabindex等于0,则tabindex大于等于1的元素切换完后再切换到该元素
  • tabindex小于0,不能通过Tab切换到该元素,但是可以通过elem.focus()使该元素获得焦点
  • 当多个元素tabindex相同,以元素在HTML代码中出现的顺序为准

例子

代码语言:javascript
复制
<ul>
  <li tabindex="1">1</li>
  <li tabindex="0">0</li>
  <li tabindex="2">2</li>
  <li tabindex="-1">-1</li>
</ul>

例子中到代码通过Tab切换时,获得焦点的元素依次为1 - 2 - 0

focusin/focusout

focusblur事件不会冒泡。如果想实现事件代理可以通过允许捕获实现。

代码语言:javascript
复制
<form id="form">
  <input type="text" name="name" value="Name">
  <input type="text" name="surname" value="Surname">
</form>

<script>
  // addEventListener第三个参数true,允许捕获
  form.addEventListener("focus", () => form.classList.add('focused'), true);
  form.addEventListener("blur", () => form.classList.remove('focused'), true);
</script>

如果想在冒泡阶段实现事件代理,可以使用focusinfocusout事件替代。

document.activeElement指向当前获得焦点的元素。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 魔术师卡颂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么元素能够focus
  • tabindex属性
    • 例子
    • focusin/focusout
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档