2010-11-08 122 views
2

我加入一个JavaScript驱动的子窗口到一个站点。基本上,部分用户界面位于屏幕的左边缘,直到用户触发链接;然后它移动到可见的位置。我有一系列五个test cases,但还没有获得声望点来单独链接它们。的preventDefault(),滚动和无障碍

对于辅助功能目的,我想使用一个链接包含文档片段,从而:

<a href="#quicklinks" id="quicklinks-trigger">Quick Links</a> 

使用JavaScript(使用jQuery)对应:

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
}); 

的#quicklinks HREF重定向内部将屏幕阅读器的光标(又名插入符号)添加到新显示的UI的开头。有一个在快速链接子窗口,光标重定向到文件(<a href="#main" id="close-quicklinks"></a>)的主要部分的相应链接。你可以在测试用例1的动作看这个,如果你听它与屏幕阅读器(我与NVDA测试),屏幕阅读器高兴地跳到快速链接时,链接被触发,并返回到主文档当快速链接关闭链接被触发时。

它还滚动响应文件碎片,这是丑陋和恼人的上下翻页。这可以通过抑制window.preventDefault() - 看测试案例2,这很顺利运作和文档周围不滚动,即:

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 

e.preventDefault(); });

不幸的是,在调用preventDefault()方法也阻止浏览器将光标移动到正确的位置。盲人用户可以在那里触发链接,然后屏幕阅读器将按照源代码顺序进行下一项,而不是快速链接用户界面。修复THAT的最简单方法是在触发器链接之后立即放置定义快速链接子窗口的HTML;但是我不能这么做,因为这个注定要用到的CMS不适合插入到菜单中的大块HTML。

我已经尝试了一些其他的方法来消除滚动。测试案例3卷动窗口后面手动:

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
window.setTimeout(function(){ scrollTo(0,0); }, 1); 
}); 

...这工作,但有一个明显的生涩的效果,因为它滚动下来,然后回来了,所以这是不超过测试用例更好1.

在测试案例4,我试图用联合的preventDefault()与手动移动内部光标的希望焦点():

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
$("#quicklinks").focus(); 
e.preventDefault(); 
}); 

但它没有工作,因为#quicklinks是一个DIV,而不是一个可聚焦元件。我想我可以在快速链接HTML中添加一个隐藏的可聚焦元素,但那会很糟糕。

在试验例5我试图从目标元件除去的ID属性,与onhashchange事件重写片段标识符,并且然后恢复ID:

function cfl_hash(fragment){ 
// Get the section the fragment refers to. 
var target = $(fragment); 

// Save its current ID. 
var id = target.attr("id"); 

// Remove the ID so the browser won't scroll. 
target.attr("id",""); 

// Rewrite the hash to the desired fragment, only if onhashchange event supported. 
if("onhashchange" in window){ location.hash = fragment; } 

// Put the ID back in place. 
target.attr("id", id); 
} 

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
cfl_hash("#quicklinks"); 
}); 

其具有允许所述滚动的不快效果但阻止光标移动。我认为我在ID交换中有错误的事件序列;这应该起到抑制滚动的作用,尽管我怀疑它会允许光标移动。

真的很烦人,你不能取消滚动视力的用户,而不取消屏幕阅读器用户的光标重定向。

到目前为止,我只测试过Firefox和NVDA。我不知道如何在浏览器和屏幕阅读器的其他组合中发挥作用。

对此提出建议?

回答

1

我想出了一个解决方法,它允许使用文档片段链接,允许屏幕阅读器的脱字符重定向,并且不会滚动视口。该方法是

  1. 放置在元素的顶部,你链接到
  2. 链接到隐藏的元素,而不是跟随它
  3. 使用固定定位移动隐藏的元素内容的隐藏元素与视口顶部齐平

通过这种方式,当您单击以隐藏元素为目标的链接时,浏览器会尝试将屏幕“滚动”到位,但它已经在视口的顶部,所以没有实际的滚动发生。脱字符重定向发生,因此屏幕阅读器用户可以到达链接指向的位置。

有一些怪癖。在Opera,Safari和Chrome中,单击以这种方式排列的链接将导致滚动,但只有在用户已经向下滚动时才会滚动。我不确定为何如此。也许他们没有更新位于屏幕左侧的固定位置元素的位置?无论如何,这个问题只会影响一系列非常具体的情况,而这些情况通过合理的页面布局可以大部分避免。所以我认为好处(可访问,相对简单的代码)超过了缺点(在一些浏览器和情况下的小视觉怪癖)。

对于这种技术的更完整的讨论,请参见:

http://www.accessifyforum.com/viewtopic.php?p=77132

希望这可以帮助其他人。