正在加载...

JavaScript 无障碍

JavaScript 无障碍是指订单控件能用键盘操作,并且状态变化会被读出来。本页使用真正的按钮。click 把可见的那一行设为 tea / regular。

这不是错误那一课

上一页抛出了 missing size。它的那一行是 caught / missing size。本页不使用 throw。控件留在页面上,结果写在看得见的地方。

使用按钮

<button type="button"> 会在鼠标点击、Enter 和 Space 时运行它的 click 监听。只监听 click 的 div 会忽略键盘。按钮上的文字就是人们听到的名称。

按钮点击

javascript
const button = document.querySelector("button");
const line = document.querySelector("#line");
button.addEventListener("click", () => {
line.textContent = "tea / regular";
});

那一行变成 tea / regular。Enter 和 Space 运行同一个监听。

读出新的一行

textContent 会更新屏幕。屏幕阅读器可能漏掉一声不响的改动。aria-live="polite" 让它在当前句子之后说出新文字。

实时状态

html
<p id="line" aria-live="polite">…</p>

改动会被读出,而且不打断当前句子。assertive 会打断。本页使用 polite。

没有 size 就禁用按钮

订单是 { drink: "tea" },没有 size。把 button.disabled 设为 true。按钮仍然可见。click 监听不会运行。

没有 size 时禁用

javascript
const order = { drink: "tea" };
const button = document.querySelector("button");
if (!order.size) {
button.disabled = true;
}

按钮还在页面上,并且不会提交订单。不要删掉这个元素。

把焦点留在按钮上

按下按钮的人已经在那里。写好那一行,然后调用 button.focus()。不要调用 line.focus(),也不要藏起轮廓。

焦点留在按钮上

javascript
const button = document.querySelector("button");
const line = document.querySelector("#line");
button.addEventListener("click", () => {
line.textContent = "tea / regular";
button.focus();
});

焦点留在按钮上。那一行不需要 tabindex。轮廓保持可见。

四个习惯

每一行都是这个订单控件的一个决定。

📊 无障碍订单控件

习惯 使用 避免
动作 带 type="button" 的 button 只监听 click 的 div
状态 行上的 aria-live="polite" 无声替换文字
不可用 button.disabled = true 移除按钮
焦点 button.focus() 和可见轮廓 line.focus() 或 outline: none

按钮承担动作。实时行说出结果。disabled 留下一个不能运行的控件。轮廓标出焦点所在。

页面上的那一行

页面把一个按钮接到实时行上。不会抛出任何东西。

无障碍订单的页面演示

html
<!DOCTYPE html>
<html>
<body>
<button id="order" type="button">Place order</button>
<p id="line" aria-live="polite">…</p>
<script>
const button = document.getElementById("order");
const line = document.getElementById("line");
button.addEventListener("click", () => {
line.textContent = "tea / regular";
button.focus();
});
</script>
</body>
</html>

click 之后,那一行读作 tea / regular。Enter 和 Space 做同一件事。caught / missing size 属于错误那一课。

在柜台

  1. 点击按钮。那一行读作 tea / regular。
  2. 在同一个按钮上按 Enter。监听再次运行。
  3. 在那一行上放 aria-live="polite",让新文字被读出。
  4. 没有 size 时,把 button.disabled 设为 true。按钮留着,click 不会运行。
  5. 成功的 click 之后调用 button.focus()。不要调用 line.focus()。

常见疏漏

div 上的 click 不是键盘控件。disabled 不等于删掉按钮。

  • 用 div 承担订单动作
  • 改了那一行却忘了 aria-live
  • size 没有时把按钮删掉
  • 订单成功后调用 line.focus()
  • 藏起焦点轮廓
  • 把那一行读成 caught / missing size

记住这些

  • button 用鼠标、Enter 和 Space 运行订单动作
  • aria-live="polite" 读出 tea / regular,并且不打断
  • 没有 size 时 button.disabled 为 true,按钮留在页面上
  • 焦点留在按钮上
  • 页面上的那一行是 tea / regular

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
6
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部