Определить, что вызвало фокусировку события? - PullRequest
13 голосов
/ 18 июля 2011

Мне нужно определить, что вызвало событие фокуса.

В идеале я хочу провести различие между щелчком, вводом с помощью вкладки / клавиатуры и ручным (через код) триггером.

Как я могу это сделать?

Я смотрю на объект события, но не вижу ничего слишком полезного.

1 Ответ

9 голосов
/ 18 июля 2011

Если фокус поступает от вызова $x.focus(), то событие не будет иметь свойства originalEvent, поскольку не было события из браузера, поэтому:

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

Чтобы различать клавиатуру исобытия фокуса на основе мыши, вы можете попробовать связать обработчик keydown со всем остальным, чтобы обнаружить Tab или Shift-Tab , но это было бы грубым взломом и, вероятно, ненадежным;например, на iPad вы не нажимаете Tab , чтобы перейти к следующему полю, вы нажимаете Next или Previous на всплывающей клавиатуре, чтобы перемещатьсяи они могут вообще не регистрироваться как нажатия клавиш.

Существует аналогичный вопрос о click событиях, которые также могут представлять интерес:

Как в jQueryя могу определить между программным и пользовательским щелчком?

Как вы заметили в комментариях, вы можете перехватывать события click, чтобы обнаружить изменение фокуса на основе мыши и установить флаг где-нибудь наПомни это.Тогда вы получите следующее:

  1. Если в событии jQuery нет originalEvent, то изменение фокуса было инициировано вручную (т. Е. $x.focus() или аналогичное).
  2. Еслифлаг обработчика щелчка устанавливается, тогда изменение фокуса происходит от действия мыши.
  3. В противном случае изменение фокуса происходит от события клавиатуры.

Вы должны быть осторожны, чтобы вашсобытия щелчка и фокуса пришли в правильном порядке, и вам нужно будет убедиться, что флаг был очищен, когда вы закончите с ним.Это может быть не пуленепробиваемым, но, возможно, это не обязательно.

...