【问题标题】:How do I disable NVDA's arrow key navigation如何禁用 NVDA 的箭头键导航
【发布时间】:2017-01-04 21:02:12
【问题描述】:

我在一个 div 中有一组按钮,其中有一些 javascript 在它们之间移动焦点以响应箭头键事件。

当我使用 NVDA/Firefox/Windows 进行测试时,似乎 NVDA 会覆盖我的箭头键处理程序并根据自己的规则移动焦点。这是一个问题,因为我的小部件是高度可定制的、动态的和响应式的 - 所以移动焦点的规则非常复杂。

Voiceover 和 ChromeVox 都没有这种行为。

我注意到向每个按钮添加 role="gridcell" 似乎可以解决此问题,但我不想这样做,因为这意味着屏幕阅读器不会将我的按钮视为按钮。除非绝对必要,否则我也真的不想更改 html 结构(例如,将每个按钮包装在另一个元素中)。

有没有办法(例如 aria 或专有属性)告诉 NVDA 不要将自己的箭头键行为应用于按钮?

【问题讨论】:

    标签: javascript accessibility screen-readers nvda


    【解决方案1】:

    考虑一下,通过覆盖用户的预期行为,您可能会创建一个完全无法使用甚至无法访问的界面。

    强烈建议不要尝试这样做。

    无论如何,您添加并尝试覆盖它的任何 ARIA 都会影响非 NVDA 用户。 NVDA 会拦截箭头键,因此在 NVDA 对箭头键做出反应之前,JavaScript 无法执行。

    请注意,NVDA 用户已经可以使用bShift + b 在按钮之间导航,因此他们不需要依赖Tab

    现在,说了这么多,您可能会发现一个与您在WAI-ARIA Authoring Practices 中尝试实现的模式相似的现有模式。

    如果您可以概述您的目标并展示一个示例,那么我可以确定一些现有的模式或技术,这些模式或技术将使您能够实现目标而不会冒着体验失败的风险。

    【讨论】:

    • 感谢您的回复。实际上,我最初是根据您链接的 ARIA 创作实践页面的“工具栏”部分创作的小部件 - w3c.github.io/aria-practices/#toolbar。但我意识到我没有将 role=toolbar 应用于容器:添加该角色似乎将 NVDA 的行为更改为更合理。该小部件基本上是一个“按钮网格”,允许将符号输入到输入区域。
    • 啊,是的,我不止一次忘记了role
    【解决方案2】:

    如果您的所有按钮都在一个容器(span 或 div)中,您可以将 role=application 添加到容器中,这将强制 所有 键盘事件转到您的应用程序而不是辅助技术.不过,Role=application 应该非常谨慎地使用。

    <div role=application>
       <button>alpha</button><br>
       <button>beta</button><br>
       <button>gamma</button><br>
    </div>
    

    【讨论】:

    • 谢谢 - 我最终通过将 role="toolbar" 添加到容器中做了一些非常相似的事情;它解决了我不需要的 NVDA 箭头键拦截的问题。从语义上讲,这是完全正确的,因为我的小部件是“用于对一组控件进行分组的容器,例如按钮、菜单按钮或复选框”,所以我对此非常满意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2012-07-09
    • 2011-05-11
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多