键盘导航的 JavaScript 微件

网页应用经常使用 JavaScript 来模拟桌面组件,比如菜单、树状视图、富文本以及标签面板等。网页中这些微件通常是由

等元素组合而成,并不是原生的,也不会提供对应的桌面组件所拥有的键盘功能。本文档主要描述能让 JavaScript 微件使用键盘访问的技术。

利用 tabindex

默认情况下,当人们使用 tab 键浏览网页时,只有交互式元素(如链接、表单控件)才会被聚焦。通过 tabindex 全局属性,作者也可以使其他元素成为焦点。当设置为 0 时,元素可通过键盘和脚本聚焦。当设置为 -1 时,元素可被脚本聚焦,但不会成为键盘聚焦顺序的一部分。

使用键盘时,元素获得焦点的顺序默认为源顺序。在特殊情况下,作者可能希望重新定义顺序。为此,作者可以将 tabindex 设置为任意正数。

警告: 避免为 tabindex 使用正值。具有正 tabindex 值的元素会被放在页面上默认的交互式元素之前,这意味着页面作者在使用一个或多个 tabindex 正值时,必须为页面上所有可聚焦元素设置(并维护)tabindex 值。

下面表格阐述主流浏览器中 tabindex 的行为:

tabindex 属性 可用鼠标或 JavaScript 语句 element.focus() 获取焦点 可使用 Tab 键导航获取焦点
不存在 遵循所在平台针对此元素的默认行为(表单控件、链接等) 遵循所在平台针对此元素的默认行为
负值(也就是说,tabindex="-1" 否;作者必须使用 focus() 来聚焦该元素。可以在方向键或者其他键的响应里面做。
零(也就是说,tabindex="0" 相对于元素在文档中的位置,以 tab 顺序排列(请注意,交互式元素如 默认具有这种行为,它们不需要该属性)。
正值(如 tabindex="33" tabindex 值决定了该元素在制表符顺序中的位置:值越小,元素在制表符顺序中的位置就越靠前(例如,tabindex="7" 将位于 tabindex="11" 之前)。

非原生控件

具有交互功能的原生 HTML 元素,如