You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript/jQuery:如何识别通过Tab键选中的元素?

解决Tab聚焦tr后回车触发跳转的问题

我明白你遇到的困扰了——通过Tab键能选中带tabindex="0"的tr,但按下回车时this却指向了body,导致拿不到tr上的data-url属性。咱们一步步拆解问题,找到解决办法:

为什么原来的代码不生效?

你最初的写法$(document.activeElement).keypress(...)有两个核心问题:

  • 页面加载完成时,document.activeElement默认是body,所以事件其实绑定在了body上,后续切换聚焦到tr时,事件并没有绑定到目标tr上;
  • 就算换成$('tr:focus'),这个选择器只会选中当前瞬间聚焦的tr,一旦tr失去焦点再重新聚焦,新的聚焦状态下的tr不会自动带上事件绑定。

解决方案1:直接给目标tr绑定事件

给所有带tabindex="0"的tr绑定keypress事件,这样每个可聚焦的tr都能响应回车操作,而且this会正确指向当前触发事件的tr:

// 给所有可聚焦的tr绑定按键事件
$('tr[tabindex="0"]').keypress(function(event) {
    // 判断是否按下回车键
    if (event.which === 13) {
        // 手动指定this为当前tr,调用跳转函数
        onRowClick.call(this);
    }
});

function onRowClick() {
    const href = $(this).data('url');
    if (href) {
        window.location.href = href;
    }
}

解决方案2:事件委托(推荐,适配动态生成的tr)

如果你的表格是动态生成的(比如异步加载数据后渲染),直接绑定事件可能会漏掉新添加的tr。这时候用事件委托更靠谱,把事件绑定到父元素(比如表格本身),监听子元素的事件:

// 把事件委托到表格,监听所有可聚焦tr的按键事件
$('#ChainResultsTable').on('keypress', 'tr[tabindex="0"]', function(event) {
    if (event.which === 13) {
        const href = $(this).data('url');
        if (href) {
            window.location.href = href;
        }
    }
});

这种方式的优势在于:不管tr是页面加载时就存在,还是后来动态添加的,只要符合tr[tabindex="0"]的选择器,按下回车都会触发跳转,而且this始终指向当前被聚焦的tr。

另外,你已经给tr设置了tabindex="0",这一步是正确的,确保tr可以被Tab键聚焦,无需修改。

内容的提问来源于stack exchange,提问作者Stu Care

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:55:49