Если фокус поступает от вызова $x.focus()
, то событие не будет иметь свойства originalEvent
, поскольку не было события из браузера, поэтому:
if(ev.hasOwnProperty('originalEvent')) {
// Focus event was manually triggered.
}
Чтобы различать клавиатуру исобытия фокуса на основе мыши, вы можете попробовать связать обработчик keydown
со всем остальным, чтобы обнаружить Tab или Shift-Tab , но это было бы грубым взломом и, вероятно, ненадежным;например, на iPad вы не нажимаете Tab , чтобы перейти к следующему полю, вы нажимаете Next или Previous на всплывающей клавиатуре, чтобы перемещатьсяи они могут вообще не регистрироваться как нажатия клавиш.
Существует аналогичный вопрос о click
событиях, которые также могут представлять интерес:
Как в jQueryя могу определить между программным и пользовательским щелчком?
Как вы заметили в комментариях, вы можете перехватывать события click
, чтобы обнаружить изменение фокуса на основе мыши и установить флаг где-нибудь наПомни это.Тогда вы получите следующее:
- Если в событии jQuery нет
originalEvent
, то изменение фокуса было инициировано вручную (т. Е. $x.focus()
или аналогичное). - Еслифлаг обработчика щелчка устанавливается, тогда изменение фокуса происходит от действия мыши.
- В противном случае изменение фокуса происходит от события клавиатуры.
Вы должны быть осторожны, чтобы вашсобытия щелчка и фокуса пришли в правильном порядке, и вам нужно будет убедиться, что флаг был очищен, когда вы закончите с ним.Это может быть не пуленепробиваемым, но, возможно, это не обязательно.