使用JavaScript检测用户计算机上是否运行屏幕阅读器,是否可行?

35

我希望检测用户机器上是否运行了屏幕阅读器,以避免HTML中音频标签与声音冲突。如果有,请提供如何完成此操作的详细信息。


1
+1. 我没有这方面的经验,但肯定支持<audio>标签的屏幕阅读器一定会找到一种避免冲突声音的方法吧?对于他们来说,这应该是核心功能,不是吗? - Spudley
通常无法检测屏幕阅读器是否正在运行。(即使某些辅助技术正在运行,它可能不是基于音频的屏幕阅读器:它可能是基于盲文的屏幕阅读器,或者是使用与屏幕阅读器相同技术的命令和控制语音控制应用程序。)如果您可以确定屏幕阅读器正在运行,您想要做什么不同的事情? - BrendanMcK
3个回答

18

即使您能够检测到屏幕阅读器正在运行,也最好不要尝试执行任何特殊操作。即使您可以为一组屏幕阅读器用户正确执行此操作,但对于另一组用户,您可能会出现错误。最好集中精力首先编写良好且干净的HTML5。

请注意,并非所有屏幕阅读器用户都使用文本转语音;许多人使用盲文输出。此外,其他类型的可访问性工具 - 如内容高亮显示器和语音输入应用程序 - 使用与屏幕阅读器相同的技术和API(例如DOM,MSAA),因此任何“检测屏幕阅读器”的技术都可能检测到这些 - 因此您不能假设它意味着用户完全失明并仅使用语音。

就目前而言,音频标签目前并不普遍可访问,不同的浏览器具有不同程度的可访问性支持-有关当前支持详细信息,请参见HTML5可访问性并向下滚动到音频。我看到一些页面在音频标签之后添加了基于HTML5的控件和JavaScript,以便他们可以提供自己的UI,以确保键盘或屏幕阅读器用户可以根据需要播放/停止音频。(最终,在浏览器赶上时,这是不需要的。)

就一般可访问性而言,WCAG 2.0(Web内容可访问性指南)建议任何自动播放超过3秒钟的音频都应该有可访问的方法来暂停或停止音频。(我会更进一步地建议不要使用任何自动音频-当使用分页浏览时,通常无法确定音频来自哪个选项卡。)


给那位点踩的用户 - 能否解释一下为什么要点踩?这个回答有什么需要改进的地方吗? - BrendanMcK
2
我不是负责下降评分的人,但我可以举一个例子,如果你正在编写一个框架,提供一些基本控件,如带有附加选择器的日期输入。对于移动平台或屏幕阅读器,你可能希望使用input[type=date]。这是一种hacky但并不难以检测移动设备的方法;问题将被解决。 - Adam Leggett
9
我也不是那个点赞数减少的人。在我的情况下,我有一个完美运作的本地选择下拉菜单,对于屏幕阅读器来说它的表现也和预期一样好。但是,当我使用像selectric这样的插件“增强”它时,它对于屏幕阅读器来说突然变得无用了。如果我知道有屏幕阅读器在使用,我就不会启动selectric,这样每个人都会更开心。 - changokun
1
我无法点踩,但在我的情况下,我希望有两个不同的表格并且数据量很大。一个用于屏幕阅读器,使用普通的 <table> 标签和 <thead> 等标签,另一个使用 <div> 表格来使其在响应式视图中更美观。正如Garrett Dimon所说:“数据表在响应式设计方面表现不佳。就是这样。” - Kurt Lagerbier

4

虽然可能不是完全可靠的方法,但可以使用焦点事件通过javascript检测屏幕阅读器的进度,因为用户在内容中快速浏览。

隐藏的“跳过导航链接”(http://webaim.org/techniques/skipnav/)如果被聚焦,将是一种检测是否有人使用屏幕阅读器的方法。

尽管它没有解决问题的音频部分。我只是想提供这个部分解决方案,因为我自己正在寻找可能检测屏幕阅读器的方法。


3
那些使用键盘导航但不使用屏幕阅读器的人怎么办? - steveax
据我所知,除了常见的IE怪癖之外,使用键盘导航无论是否使用屏幕阅读器都意味着焦点事件。例如,Safari的辅助VoiceOver在使用键盘快速浏览内容时会应用焦点。当用户通过页面进行标签切换时,可以使用tabindex来按顺序强制将焦点放在特定元素上。@stevax,以上是我的看法。 - hexalys
也许我在评论中表达得不够清楚。我的观点是,无法区分使用屏幕阅读器的用户和其他使用键盘导航(可能与辅助功能有关)但未使用屏幕阅读器的人,尝试以此方式针对屏幕阅读器用户可能会导致很大的问题。 - steveax
我明白你的意思。"display:none;" 对于屏幕阅读器来说是一个障碍。然而,一个可行的方法是在三个连续元素中标记一个中间元素为aria-hidden="true"或aria-disabled="true"。如果元素1和3接收到焦点,那就表明使用了辅助技术(因为跳过了一个元素),而不仅仅是简单的键盘导航。由于我预见不到任何键盘导航工具或插件应用任何WAI-ARIA相关的状态或属性。 - hexalys
以下是一些示例代码(可能已过时),用于检测JavaScript事件的差异(屏幕阅读器、键盘用户和鼠标用户之间的差异)。网址为http://dylanb.github.io/screenreaderdetection/。 - robocat
@robocat - 我刚刚尝试了Chrome,它说“浏览器平台不支持”。 - clayRay

1

无法使用JavaScript检测屏幕阅读器,也无法使用任何客户端技术检测屏幕阅读器。您可以使用Flash检测正在运行MSAA客户端的软件。有关其工作原理以及为什么不应使用它来检测屏幕阅读器的更多详细信息,请参见此处:开发者请注意:不要使用Flash检测屏幕阅读器


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