如何修复“按钮”交互角色必须是可聚焦的

Posted

技术标签:

【中文标题】如何修复“按钮”交互角色必须是可聚焦的【英文标题】:How to fix 'button' interactive role must be focusable 【发布时间】:2019-10-19 20:41:55 【问题描述】:

我有用户可以选择的下拉选项列表。

下拉菜单中的 optinos 使用标签::

<a onClick=() => handleSelect(filter) role="button">
   filter.name
</a>

问题是我必须添加tabIndex="0" or -1,以修复来自 Eslint 的错误。

但是当我添加tabIndex=0 时,我的按钮不再起作用。

还有其他方法可以解决这个错误吗?

这是下拉组件的外观:

<ul name="filters" className="dropdown">
    filterOptions.map((filter) => (
      <li
        key=filter.id
        defaultChecked=filter.name
        name=filter.name
        className=`option option-$filter.selected ? 'selected' : 'unselected'`
      >
        <span className=`option-$filter.selected ? 'checked-box' : 'unchecked-box' ` />

        <a onClick=() => handleSelect(filter) role="button">
          filter.name
        </a>
      </li>
    ))
  </ul>

【问题讨论】:

【参考方案1】:

按钮是交互式控件,因此具有焦点。如果按钮 角色被添加到本身不可聚焦的元素(例如 &lt;span&gt;&lt;div&gt;&lt;p&gt;) 然后,必须使用 tabindex 属性 使按钮具有焦点。

https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role#Accessibility_concerns

html属性tabindex对应于属性tabIndex 反应。

https://reactjs.org/docs/dom-elements.html

所以我认为@S.. 答案是正确的:

<a 
  onClick=() => handleSelect(filter) 
  role="button"
  tabIndex=0
>
  filter.name
</a>

【讨论】:

【参考方案2】:

添加标签索引:

<a onClick=() => handleSelect(filter) role="button" tabIndex=i>
    filter.name
</a>

在向地图添加迭代器后:(filter, i)

【讨论】:

请注意,将 tabIndex 设置为大于 0 可能会导致问题,因此不建议这样做,因为它会将这些项目置于默认焦点顺序之前。有关详细信息,请参阅 MDN Understanding the Web Content Accessibility Guidelines 和 Don’t Use Tabindex Greater than 0

以上是关于如何修复“按钮”交互角色必须是可聚焦的的主要内容,如果未能解决你的问题,请参考以下文章

如何修复自定义按钮在 SwiftUI(IOS) 中的交互?

前后端交互流程,如何进行交互

Flash 与背景按钮的交互性

如何修复“损坏的”交互式变基?

如何让 ScrollView 半透明并使其背后的内容具有交互性?

我们如何解决 <p> 标签上的 eslint 错误“不应为非交互式元素分配交互式角色”