确定触发焦点事件的内容?

我需要确定导致焦点事件的原因。

理想情况下,我想区分点击,标签/键盘输入和手动(通过代码)触发器。

我怎样才能做到这一点?

我正在看事件对象,但我没有看到任何有用的东西。

如果焦点来自$x.focus()调用,则事件将没有originalEvent属性,因为浏览器没有事件,因此:

 if(ev.hasOwnProperty('originalEvent')) { // Focus event was manually triggered. } 

要区分基于键盘和鼠标的焦点事件,您可以尝试将keydown处理程序绑定到其他所有内容以检测TabShift-Tab,但这将是一个严重的黑客攻击,可能不可靠; 例如,在iPad上,你没有点击Tab移动到下一个字段,你在弹出键盘中点击NextPrevious来移动,那些可能根本没有注册为按键。

关于可能感兴趣的click事件也有类似的问题:

在jQuery中,如何区分编程和用户点击?

正如您在注释中所述,您可以捕获click事件以检测基于鼠标的焦点更改,并在某处设置标记以记住它。 然后你有这个:

  1. 如果jQuery事件中没有originalEvent ,则手动触发焦点更改(即$x.focus()或类似事件)。
  2. 如果设置了单击处理程序标志,则焦点更改来自鼠标操作。
  3. 否则焦点变化来自键盘事件。

您必须小心,您的点击和焦点事件的顺序是正确的,并且您需要确保在完成后清除该标志。 这可能不是防弹,但可能不是必须的。