本文详解如何使用 jquery 在用户通过键盘 tab 键首次聚焦到某个 div(如 `.inside`)时立即执行操作,解决
`keydown` 监听失效、事件延迟触发的问题,并提供健壮的焦点进入检测方案。
在 Web 可访问性开发中,确保键盘导航(尤其是 Tab 键)行为可预测、响应及时至关重要。许多开发者尝试用 $('.inside').on('keydown', ...) 监听 Tab 键(keyCode 9)来判断“用户是否刚进入 .inside 区域”,但会发现:控制台日志总在第二次按 Tab 时才触发——这是因为 keydown 事件发生在焦点转移之前,此时元素尚未获得焦点,document.activeElement 仍指向上一个元素;而当 Tab 键松开(keyup)时,焦点已完成转移,此时才是检测“真正进入”的理想时机。
✅ 正确做法是监听 keyup 事件,并结合焦点状态判断:
$('.inside').on('keyup', function(e) {
if (e.keyCode === 9) {
// Tab 键松开时,焦点已移入当前 .inside 元素(或其子元素)
console.log('Tab key released — focus is now inside .inside');
}
});⚠️ 但需注意:该方案会在每次在 .inside 内部按 Tab(例如从 Inside Link 1 切换到 Link 2)时都触发,而通常我们只关心“首次进入容器”这一时刻。
? 更精准的解决方案:检测 Tab 松开时,首个可聚焦子元素是否为当前 active 元素(即焦点落在 .inside 的第一个可交互节点上,代表“刚刚抵达该区域入口”):
$('.inside').on('keyup', function(e) {
if (e.keyCode !== 9) return;
// 获取 .inside 下第一个可聚焦元素(如 , ? 补充说明与最佳实践:
// 推荐:让 .inside 本身可聚焦(无障碍友好)
$('.inside').attr('tabindex', '0');
$('.inside').on('focus', function() {
console.log('? Focus entered .inside container directly');
// 适用于需要容器级响应的场景(如展开面板、滚动到视图等)
});✅ 总结: