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

解决React中role为menu的div无键盘访问的508合规性错误问询

解决方案

报错根因

你触发报错的核心原因是:role="menu"属于ARIA规范定义的交互控件角色,强制要求配套完整的键盘访问逻辑,仅添加role属性没有实现对应键盘交互就会触发508合规性检测失败。另外你当前的角色匹配也存在错误,role="menu"的直接子项需使用role="menuitem"而非listItem。

具体修复步骤

方案1:保留role="menu"的实现(适用于应用类操作菜单)

  • 调整语义结构:将li的role改为menuitem,每个菜单项内置可聚焦元素(如<button>),或给li添加tabIndex属性控制聚焦状态
  • 绑定键盘事件,实现ARIA规范要求的菜单键盘交互逻辑:
    • 上下方向键:在菜单项之间切换焦点
    • Enter/空格键:触发当前菜单项的点击逻辑
    • Esc键:收起侧边栏(如果是可折叠结构)
    • Home键:直接聚焦第一个菜单项
    • End键:直接聚焦最后一个菜单项
  • React示例代码:
import { useState } from 'react'

const SideMenu = () => {
  const [focusIndex, setFocusIndex] = useState(0)
  const menuItems = ['项1', '项2', '项3']

  const handleKeyDown = (e) => {
    switch(e.key) {
      case 'ArrowDown':
        e.preventDefault()
        setFocusIndex(prev => (prev + 1) % menuItems.length)
        break
      case 'ArrowUp':
        e.preventDefault()
        setFocusIndex(prev => (prev - 1 + menuItems.length) % menuItems.length)
        break
      case 'Home':
        e.preventDefault()
        setFocusIndex(0)
        break
      case 'End':
        e.preventDefault()
        setFocusIndex(menuItems.length - 1)
        break
      case 'Escape':
        // 这里添加侧边栏收起逻辑
        break
    }
  }

  return (
    <div role='menu' onKeyDown={handleKeyDown}>
      <ul role='none'> {/* 移除ul默认的list语义,避免语义重复 */}
        {menuItems.map((item, index) => (
          <li 
            role='menuitem'
            key={index}
            tabIndex={focusIndex === index ? 0 : -1}
            onClick={() => console.log('点击', item)}
            onKeyPress={(e) => {
              if(e.key === 'Enter' || e.key === ' ') {
                e.preventDefault()
                console.log('触发', item)
              }
            }}
          >
            {item}
          </li>
        ))}
      </ul>
    </div>
  )
}

方案2:替换语义角色(适用于站点导航侧边栏,更简单合规)

如果你的侧边栏是站点导航而非应用内的操作菜单(比如右键菜单、功能操作下拉菜单),role="menu"其实属于语义误用,这类场景更推荐用原生<nav>标签实现,原生元素自带键盘支持,无需额外写键盘交互逻辑:

<nav aria-label="侧边栏导航">
  <ul>
    <li><button>导航项1</button></li>
    <li><button>导航项2</button></li>
    <li><button>导航项3</button></li>
  </ul>
</nav>

注:导航项如果是跳转链接直接用<a>标签即可,原生可聚焦且支持回车触发,完全符合508合规要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 19:24:06