【发布时间】:2020-04-14 06:45:24
【问题描述】:
为了使应用程序符合W3C feed pattern,我必须创建键盘命令来帮助屏幕阅读器用户浏览通过无限滚动加载的内容。请参阅工作示例 here。
在示例页面上,关注列表中的一项,然后按 PAGE_DOWN/PAGE_UP。看?这使您可以浏览列表项,同时跳过每个项的内容。
如果您专注于其中一个项目中的按钮并尝试从那里导航,它仍会在文章之间正确导航。 这就是我希望我的应用程序的行为方式,但事实并非如此。
我的代码与示例中的代码基本相同。 <section role="feed"> 内有多个 <article> 元素。使用 jQuery,我将 'keydown' 事件附加到 <section>,称为 #product-grid。
$('#product-grid').keydown(function(event) {
// Detect which key was pressed and execute appropriate action
});
HTML 结构:
<section id="product-grid" role="feed">
<article tabindex="-1">
<a href="#"> having focus on this element prevents the 'keydown' event from firing
<img src="..."/>
<p>some text</p>
</a>
<div>
if you click on this non-interactive section instead, the event fires correctly
</div>
</article>
(...) many other <article> elements
</section>
在我的文章里面,有主播。如果你专注于它们并按下一个键,'keydown' 事件不会触发。如果您将注意力集中在文章的其他任何地方,它确实如此。
据我了解,当子项具有焦点时,父项(在本例中为 #product-grid)也处于焦点中。我说的对吗?
我尝试过的事情:
- 委托事件,使用 on() 捕获
#product-grid中某些元素(包括锚元素)上的 keydown 事件。 - 直接将keydown 事件处理程序附加到
<article>内的锚点。当我专注于它并按下一个键时,什么也没有发生。根据我在 SO 上搜索的结果,这应该是可行的。
这是一个可以重现问题的小提琴: https://jsfiddle.net/fgzom4kw/
重现问题:
- 单击任何项目的灰色背景(不是锚点)。红色轮廓表示它已聚焦。
- 使用 PAGE UP 和 PAGE DOWN 浏览项目。
- 按 TAB,将焦点设置在其中一个锚点上。
- 在锚点处于焦点位置后,尝试使用 PAGE UP 和 PAGE DOWN 键再次导航。
将此行为与W3C example 的行为进行比较。
问题已解决。有两种解决方案:
我的方式:https://stackoverflow.com/a/59449938/9811172
<matrixRef> 或者高速公路! </matrixRef>
Twisty 的方式:https://stackoverflow.com/a/59448891/9811172
检查 cmets 是否有任何警告。
【问题讨论】:
标签: jquery jquery-events