我想将HTML5 hidden
支持与jQuery的.toggle()方法配对。
所以给定<p id="myElement">Hi there</p>
$('#myElement').toggle()
会隐藏元素,并设置hidden="hidden"
:
<p id="myElement" style="display: none;" hidden="hidden">Hi there</p>
再次执行相同的$('#myElement').toggle()
脚本会显示(切换)元素,并删除hidden="hidden"
属性(它是一个布尔值):
<p id="myElement" style="display: inline">Hi there</p>
我可能想要使用the method的完整功能,可能是
的内容$('#myElement').toggle(
if ($this.css('display')==='none'){
$this.prop('hidden', 'hidden');
}
else
{
$this.removeProp('hidden');
}
)
扩展.toggle()
以切换HTML5 hidden
属性的最佳效果解决方案是什么?这样做是多余的吗?
这个问题是Adding WAI-ARIA support to jQuery .toggle() method的变体;确定在切换元素显示的同时切换aria-hidden
状态是多余的。
答案 0 :(得分:2)
可以使用hidden
方法的完整函数切换.toggle()
属性:
$('#myElement').toggle(function() {
if ($(this).css('display')==='none'){
$(this).prop('hidden', 'hidden');
}
else
{
$(this).removeProp('hidden');
}
})
有关工作示例,请参阅http://jsfiddle.net/jhfrench/g8Sqy/
注意:
$(this)
,而不是$this
.toggle(function() {...})
,而不是.toggle(...
)hidden
为really, really slower,而非普通.toggle()
答案 1 :(得分:2)
对此的一些评论可能有用也可能没有用 - 把它作为一个答案,因为它太长而不适合评论:-) -
虽然hidden
背后的想法是它有可能提供比display:none
更好的可访问性(它不需要可访问性工具来了解CSS),但目前还没有具体的或可测试的我知道的好处 - 因为屏幕阅读器无论如何都支持CSS方法。
(...或者更确切地说,屏幕阅读器使用的浏览器已经解析了CSS并通过平台的辅助功能API将隐藏的信息传递给屏幕阅读器。可能从hidden
受益的主要工具将是其他可访问性工具,它们直接使用自己的DOM副本,而不是与“主机”浏览器通信。)
(此外,在一个完美的世界中,CSS将纯粹是表现性的,通常不是。使用display:none
是一种情况,它不是 - 它通常用于表示内容当前不相关,是语义信息;而hidden
确实解决了这种情况;但还有其他案例需要解决:生成的内容可能是其他主要案例。)
我有点犹豫要采用新功能,直到我能验证它们的行为和按计划工作:新功能以某种方式指定并不是很常见,但最终会在一种略有不同的方式,它对如何实际使用该特征有影响。 (使用ARIA role =“application”是具有plenty of caveats的功能的一个很好的例子。)并且在一天结束时,它不符合使页面可访问或不访问的规范,因为它是内容,浏览器和屏幕阅读器(或其他可访问性工具)的整个组合如何协同工作对最终用户。
需要注意的另一个问题是:the HTML5 spec says of the hidden
attribute:
[...]例如,使用隐藏来隐藏选项卡式对话框中的面板是不正确的,因为选项卡式界面仅仅是一种溢出显示[...]
但是,选项卡式对话框是jQuery的toggle
/ show
/ hide
/ etc方法的常见用例;因此,在所有这些情况下应用hidden
可能[技术上]违反规范。似乎同样的推理也适用于页面菜单栏及其弹出菜单。