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

mpe*_*pen 14 javascript jquery events javascript-events

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

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

我怎样才能做到这一点?

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

mu *_*ort 10

如果焦点来自一个$x.focus()调用,那么该事件将没有originalEvent属性,因为浏览器没有事件,所以:

if(ev.hasOwnProperty('originalEvent')) {
    // Focus event was manually triggered.
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

  • @DSimon但是订购是否有任何标准保证? (2认同)