[英]Screen Reader not reading the page when navigated with keyboard on React.js
当用户通过单击链接组件导航到新页面时,屏幕阅读器会以正确的顺序完美地读取新页面。 如果用户通过按 Enter 或空格键选择新页面,浏览器仍会导航到正确的页面,但屏幕阅读器不会读取页面内容。
新页面导航的代码如下所示:
<Card className={classes.root}>
<Link to={`/event/${eventId}`} component={CardActionArea}>
<CardMedia
className={classes.media}
/>
<CardContent className={classes.cardContent}>
...some info..
</CardContent>
</Link>
</Card>
我试图通过创建一个 keyDownEvent 来解决这个问题,但它没有用:
const elementRef = React.createRef<HTMLAnchorElement>();
const handleKeyDown = (e) => {
if (e.keyCode === 13 || e.keyCode === 32) {
e.preventDefault();
elementRef.current.click();
}
}
并在链接中调用它
<Link to={`/event/${eventId}`} component={CardActionArea} onKeyDown={(e) => handleKeyDown(e)}>
任何人都知道我哪里出错了或者我应该尝试什么?
无法告诉你如何在 React 中做到这一点,但这是一个简单的过程,所以我相信你不会挣扎。 解决您的问题的关键部分是“导航后”标题,但是如果可以,请尝试实现所有内容,因为它将极大地改善屏幕阅读器的用户体验。
推荐用于在 SPA 中处理导航的方法实际上非常简单,只需两个步骤。
如果您使用 SPA 模式(因此会中断正常导航),则需要向用户发出正在加载页面的信号。 例如,我单击您的链接,您需要让我知道正在执行操作(加载.....),因为您使用e.preventDefault()
或等效方法拦截了正常的浏览器行为。
最简单的方法是在解释页面正在加载的区域上使用aria-live=assertive
。 你可以谷歌如何正确实现,但本质上你会更新一个隐藏的div( <div aria-live="assertive" class="visually-hidden">loading</div>
)的内容,第二个加载消息链接被点击。
这应该在进行任何 AJAX 调用之前完成。
当新页面加载时,您需要管理焦点。
最好的方法是为每个具有tabindex="-1"
页面添加一个 1 级标题 ( <h1>
)。 通过使用tabindex="-1"
这意味着标题不会被 JavaScript 以外的任何东西聚焦,因此不会干扰正常的文档流。
一旦页面加载并完全填充内容,您在 JavaScript 导航功能中执行的最后一个操作就是将焦点放在此标题上。
这有两个好处:
此时,您可能还想清除<div aria-live="assertive">
内容,以便为进一步导航做好准备。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.