如何防止NVDA自动设置焦点在上次使用的HTML元素上?

9
我们正在对现有的Web应用程序实施可访问性。我们与Firefox和NVDA合作。 关于我们的Web应用程序的简要介绍: 我们的Web应用程序是具有多个步骤(步骤1,步骤2:这些是不同的Web页面)的表单。每个步骤都有一个前/后超链接,以便转到上一个或下一个步骤。在最后一步中,用户可以查看他们的输入并提交表单或返回更改值。当用户转到先前的页面更改某些值时,我们将放置一个#anchor,使页面转到该锚点。然后,在Jquery中,我将焦点放在该锚点之后的第一个可聚焦元素上。
这很好用,除了当NVDA处于活动状态时:
当NVDA处于活动状态时,NVDA会强制将焦点放在用户上次在此页面上使用的HTML元素上。在我的情况下,NVDA将焦点放在“下一个”超链接上。 NVDA覆盖了我在$(document).ready()函数中设置的焦点。
我尝试更改NVDA中几乎所有的设置,但没有找到可以解决问题的设置。
我在网上搜索任何可以设置的ARIA属性,告诉NVDA我将管理焦点和导航,但我没有找到任何信息。
是否有人知道如何解决这个问题?
非常感谢!

我不明白“我们放置一个#锚点,使页面跳转到该锚点”的意思。你是指可以编辑你的名称并跳回该控件,还是指上一个按钮将焦点设置在表单内部,这样人们就不需要浏览页面的其余部分? - Ryan B
我们在一个部分的顶部放置了一个锚点。在最后一步,用户可以决定修改一个部分的输入,因此他们点击修改按钮,我们将其带回到那个步骤,并将锚点定位到该步骤的那个部分。例如:在第1步中,您填写有关您、配偶和孩子的信息。在最后一步,您想更改配偶的生日。因此,您单击配偶信息旁边的修改按钮,应用程序会将您带回第1步,并将锚点定位到配偶部分。不知道我是否清楚。真的很想能够发布一个示例。 - Mathieu G
您可以编辑您的帖子并发布代码。只需发布一小段或其他内容即可。 - Ryan B
3个回答

2

我知道这篇文章已经有几个月了,但是我遇到了同样的问题,在经过了一个漫长的夜晚和不停地碰壁之后,我在NVDA错误追踪器上提出了问题。结果发现这种奇怪的行为实际上是设计时的问题!

不管怎样,我找到了一个解决方法,对于我来说可以使用Firefox 32和NVDA 2014.2。

$(document).ready(function() {
        function resetTab(){
            document.getElementById('toplink').focus();
        }
        window.setTimeout(resetTab, 250);
    });

需要jQuery或另一种检测加载窗口的方法。显然还需要一个ID为"toplink"的元素,或者在代码中更改ID。如果这对您有用,请告诉我 :)


1
据digitaltoast报道,这种行为是设计上的,参见提交表单时焦点缓存#5351
直接来说,焦点并没有被缓存。我们缓存了用户在页面上的最后位置,这间接导致了焦点的改变。缓存用户的最后位置是必要的,以确保在页面之间前进和后退、恢复关闭的选项卡/窗口等操作时,将用户放在正确的位置,这是我们的用户需要和期望的功能。不幸的是,它确实有你所描述的副作用。
如果URL更改,则该问题不会出现,因此一个可能的解决方案是向查询字符串添加一个随机参数。
GET表单似乎没有受到影响(URL更改),直到使用相同的数据提交(URL相同),然后问题就会出现。
我还注意到,如果表单在IFRAME中,则不存在该问题。

没错。一个解决方案是在现有的URL上添加一个随机的GET参数。 - Hrvoje Golcic

0
在我的情况下,NVDA将焦点放在“下一个”超链接上。 NVDA覆盖了我在$(document).ready()函数中设置的焦点。
这听起来像是当用户点击“上一个”时,您正在做什么。
<a href="#" onClick="history.go(-1); return false;">Go back</a> 

我认为这可能是与浏览器相关的问题。有些页面会记住你离开时的位置。由于您没有重新加载页面,只是返回,ready()不会再次触发。已经有人问过如何让ready()再次触发,这可能会有所帮助。但是,考虑到我的假设,您可能会遇到一些确定用户是否按了返回键的问题。

我在网上搜索了任何可以设置的ARIA属性,以告诉NVDA我将管理焦点和导航,但我没有找到任何信息。

在这里,ARIA无法起作用。问题在于您如何在应用程序中向后导航。

我唯一能想到的解决方法是重新设计应用程序。如果您依赖于history.go(-1),则需要创建一个新函数来模拟ready()


我不会执行history.go(-1)。这是一个asp.net应用程序,每个操作都在进行postback。我们只进行服务器端验证(...我知道 ;) 政府的事情,旧的架构)。所以document.ready()函数正在触发! - Mathieu G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接