在密码框提示大写锁定已开启,是输入体验里性价比很高的一处改进。写法上常见的问题是监听 keydown:事件在按键按下时触发,此时修饰键状态与实际生效状态可能不一致,还会在按住不放时反复触发。

推荐写法
pwd.addEventListener('keyup', (event) => {
const on = event.getModifierState('CapsLock');
hint.hidden = !on;
});
getModifierState 由 KeyboardEvent 提供,返回修饰键的当前状态,跨浏览器一致,不需要读取 event.key 或判断字符大小写。
为什么不用 keydown 推断
- keydown 触发时状态位尚未稳定,某些输入法与远程桌面环境下读到的值滞后一步;
- 长按会连续触发,提示文案反复闪烁;
- 由 event.key 的大小写推断会漏掉 Shift 组合,A 与 a 都无法可靠区分锁定状态。
三个注意点
- 只在必要的字段上提示。密码框、验证码框这类区分大小写的输入值得加,普通文本框不需要。
- 提示不阻断输入。用行内提示元素,不要用 alert 或禁用输入。
- 无障碍与时机。提示节点加
aria-live="polite",失焦时清除状态,避免提示残留在页面上。
边界
触屏设备与虚拟键盘不存在大写锁定概念,属性读取返回 false,提示不会误报。远程桌面与输入法场景下的首次读取可能不准,一次按键之后即为真实状态,属于可接受范围。
