屏幕阅读器和 Javascript

Posted

技术标签:

【中文标题】屏幕阅读器和 Javascript【英文标题】:Screen readers and Javascript 【发布时间】:2016-09-23 09:28:58 【问题描述】:

我正在创建a website for a reading service for the blind and visually impaired,我正在使用javascript(用jquery)将一些东西打印到页面加载后的一些页面。

将屏幕阅读器读取在页面加载后用jQuery打印到页面的内容?

从this page - “一般来说,[屏幕读者]访问DOM(文档对象模型),并且他们使用浏览器API(应用程序编程接口)来获取所需的信息。”

我们知道 jQuery 是一个 DOM 操作库。

所以问题变成了.. 屏幕阅读器是否会获取整个 DOM 的副本,然后解析并阅读它?或者他们是否读取 DOM,与 jQuery 工作的相同?

这是我使用javascript的一个页面的一个例子。它使用一个函数,确定我们在空中播放的哪个程序,然后打印程序的名称和收听它的链接。

<div id="now-playing-div"></div>

<script>

// invoke the audio-reader javascript library
$( document ).ready( function() 
  var callback = nowPlaying; // catalog, schedule, podcasts, archive or nowPlaying
  var selector = '#now-playing-div';
  makeAudioReaderPage(callback, selector);
);

</script>

所以,如果您可以看到,如果屏幕阅读器没有读取JavaScript / jQuery打印到#Now-Play-div的内容,那么它将只读它。然后,我们开始收到一些困惑的倾听者的电子邮件,想知道现在玩的链接发生了什么。

所以今天早上我添加了这个:

<div id='no-js'>Please enable JavaScript to receive this content.</div>

<script>
$( document ).ready( function() 
  $('#no-js').toggle();
);

</script>

但如果问题不是需要启用 JavaScript(a recent survey shows 99% 的屏幕阅读器用户都启用了 JavaScript),那么问题就没有解决,而且会变得更糟,因为现在屏幕阅读器用户会认为 JavaScript 未启用。

怎么办??

【问题讨论】:

您必须咨询特定的屏幕阅读器提供商。没有办法回答这个问题 - 他们应该查询实时 dom,因此会看到任何变化。但是如果一个特定的查询一次并缓存,那么它可能不应该被使用。 “静态”页面不再存在,并在页面的立即死亡/无用/陈旧的副本上工作非常毫无意义/愚蠢。 span> 初始测试的好方法 - 安装NVDA,免费屏幕阅读器。如果您使用的是 Mac,请尝试 VoiceOver。您还可以下载并运行JAWS 的试用版。获取video overview of NVDA 或keyboard shortcuts for all。之后,探索ARIA live regions。 【参考方案1】:

您无需了解屏幕阅读器如何解析 DOM 即可对此进行测试。我提供这个答案主要是因为您没有提供任何要测试的代码(“某些页面的某些内容”不是要测试的代码)并且您的示例没有提供足够的上下文。

安装NVDA,一款适用于 Windows 的免费屏幕阅读器。 如果在 Mac 上,请打开 VoiceOver。 如果在 Ubuntu / Gnome 上,请安装 Orca 下载并运行JAWS 的试用版。 如果在 ios 上,请打开 VoiceOver。 如果在 android 上,请打开 TalkBack。 见鬼,试试 Windows 上的讲述人。

有很多教程可以帮助您启动和运行。以下是一对:

video overview of NVDA。 获取keyboard shortcuts for many screen readers的列表。

然后,如果您发现您的脚本在屏幕阅读器已经解析了 DOM 后修改了它,请探索ARIA live regions,然后查看browser support。

最后,如果您使用&lt;noscript&gt; 元素,上面关于检测脚本是否启用的示例实际上并不需要脚本工作:

<noscript>
 <p>
 Please enable JavaScript to receive this content.
 </p>
</noscript>

如果浏览器启用了脚本,这将不会呈现(这很好)。但是,这并不能解决您要显示的脚本块由于其他原因(网络延迟、错误等)而失败的情况。 More on &lt;noscript&gt;

既然您说您正在“为盲人和视障人士创建一个阅读服务网站”,那么您确实有责任学习这些工具以及如何使用它们进行测试。

【讨论】:

对不起,这不是我的意图(尽管我现在发现这听起来有点刺耳)。部分问题在于这是一个移动的目标,因此很难给出简单的答案。【参考方案2】:

“通常,[屏幕阅读器] 访问 DOM(文档对象模型),并使用浏览器 API(应用程序编程接口)来获取所需的信息。”

现代屏幕阅读器使用 Accessibility API。他们不必了解 Javascript 或真正的 DOM 和 html (ChromeVox 除外)

因此,相同的屏幕阅读器将用于通过您最喜欢的浏览器访问 Internet、使用您最喜欢的程序(Thunderbird、Outlook 等)编写邮件或播放 Flash 播放器游戏,只要这些程序向其辅助功能 API 提供正确的信息。它们不直接解析 HTML,而是解析文档的可访问树视图。

这意味着如果您的浏览器能够理解 javascript,那么您的屏幕阅读器就会。这是因为,您的屏幕阅读器不会在页面加载时直接访问 DOM,而是会与浏览器提供的 Accessibility API 进行交互。

现在,显然,如果您的屏幕阅读器在内容被 javascript 修改之前读取内容,那么它不会对 javascript 所做的修改有任何线索。就此而言,您可以使用aria-live 属性。

这是一个简短的摘要,但以下文章可以为您提供有关屏幕阅读器解析 DOM 的更多信息: Why accessibility APIs matter

【讨论】:

【参考方案3】:

我需要告诉屏幕阅读器页面已更改,它需要再次阅读内容。

这是通过 ARIA 属性完成的。

我已将 aria-live="polite" 添加到我的 html 中。 “礼貌”设置告诉屏幕阅读器它应该阅读新内容,但不要打断当前正在说的内容。 IIRC 的其他设置是 offassertive

<div id="now-playing-div" aria-live="polite"></div>

<script>

// invoke the audio-reader javascript library
$( document ).ready( function() 
  var callback = nowPlaying; // catalog, schedule, podcasts, archive or nowPlaying
  var selector = '#now-playing-div';
  makeAudioReaderPage(callback, selector); // the callback will append HTML to the element via jquery with the selector as the query term
);

</script>

现在我让一个什么都看不到的人在网站上测试,他以前可以看东西,而且他在失去视力之前学会了使用电脑。不幸的是,他在网站上遇到了困难。问题是,当他进入该页面收听音频时,他使用键盘快捷键搜索播放按钮但没有播放按钮,因为播放按钮(jplayer)在单击后弹出的弹出窗口中一条链接。他很沮丧,电话结束了:(

所以好消息是他能够通过 jquery 读取附加到文档的内容,但坏消息是网站的流量和他的期望存在更大的问题。这当然是我的错。

【讨论】:

以上是关于屏幕阅读器和 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

Flex订单属性,屏幕阅读器和辅助功能

如何让屏幕阅读器读取文档加载和文档加载?

是否有在线模拟屏幕阅读器工具来测试自定义网页? [关闭]

屏幕阅读器用户更喜欢在替代文本“&”或“&”中使用啥?

在使用 NVDA 等屏幕阅读器时,如何按向左或向右键?

具有 aria-hidden 和 css visibility:hidden 属性的元素是不是会被屏幕阅读器读取?