假设您有一个简单的单页应用程序 - 无论它是使用 Backbone、Angular、Ember 还是其他任何工具编写的。
您如何告诉屏幕阅读器我们在遵循路线时更改了“页面”?
在经典应用程序中,当我从 /index.html 导航到 /about.html 时,屏幕阅读器显然会检测到页面更改,并在您重新阅读时会期待。
但是在我的 Backbone 应用程序中,当我遵循一条路线时,我不知道如何触发“重读”。我已经尝试触发我在某处看到的 focus 事件,但这似乎不起作用。
注意:我目前正在使用 NVDA/Chrome 进行测试。
最佳答案
总的来说,您应该不需要触发“重读”,并且根据您的 UI 这可能无论如何都不是一件好事。
我的经验是使用 angular.js(作为可访问性人员而不是开发人员),我们的总体方法是管理焦点而不是触发重新阅读。 (我们进行了广泛的可访问性测试。)
从 UI 的 Angular 来看(主要针对屏幕阅读器用户),关键是选择一个链接(例如 about.html )应该将您带到某个地方。
在这种情况下,放置焦点的适当位置将是关于“页面”的内容区域的顶部,希望是<h1>。 .
为了让它工作,目标元素应该可以通过脚本聚焦,所以可能需要 tabindex除非它是链接或表单控件:
<h1 id="test" tabindex="-1">
-1意味着它不是默认的 Tab 键顺序,但可以通过脚本聚焦。查看更多信息 WAI-ARIA authoring practices .
然后在加载新内容的函数末尾,包括 tabindex 属性,添加如下内容:
$('#test').attr('tabindex', '-1').css('outline', 'none');
$('#test').focus();
添加tabindex时动态地,最好在 focus() 之前的一行中这样做功能,否则它可能无法工作(我记得使用 JAWS 进行测试)。
为了测试这个,我会使用:
在 Safari/OSX 上使用 VoiceOver 进行测试也很好,但工作方式不同,可能不会遇到与基于 Windows 的屏幕阅读器相同的问题。
你会遇到很多 Chrome/NVDA 的问题,因为它没有得到很好的支持,最终用户不太可能使用它。 IE 与 NVDA 兼容,但 Firefox is best .
总的来说,了解 WAI-ARIA 创作实践是值得的,尤其是 Using ARIA in HTML .即使您使用的是 JS 应用程序,浏览器(以及屏幕阅读器)也会解释生成的 HTML,因此建议仍然相关。
最后,如果您正在更新页面内容而用户按下空格/回车来激活某些内容,您可能会发现 JAWS/NVDA 不知道新内容,因为它们的“虚拟缓冲区”已经没有更新。在这种情况下,您可能需要添加 JS shim to make them update ,但只有在测试中遇到问题时才这样做,它不应该是全局补丁。
关于javascript - 告诉屏幕阅读器页面已在 Backbone/Angular 单页应用程序中更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18619186/
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
有什么方法可以告诉sidekiq一项工作依赖于另一项工作,并且在后者完成之前无法开始? 最佳答案 仅使用Sidekiq;答案是否定的。正如DickieBoy所建议的那样,您应该能够在依赖作业完成时将其启动。像这样。#app/workers/hard_worker.rbclassHardWorkerincludeSidekiq::Workerdefperform()puts'Doinghardwork'LazyWorker.perform_async()endend#app/workers/lazy_worker.rbclassLaz
我的一个模型中有一个名为sui的字段。它代表“标准用户标识符”。当该字段出现验证错误时,Rails会打印“Suiisrequired”或“Suiisalreadytaken”。如何告诉Rails'sui'.titleize是“SUI”?我查看了Inflector.human,但这并不完全正确。 最佳答案 在这种情况下,我使用custom_err_msg插入。安装后,您可以提供如下自定义错误消息:validates_presence_of:sui,:message=>'^SUIisrequired'当您将^放在开头时,Rails不会输
我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如