Мне нужно определить, что вызвало событие фокуса.
В идеале я хочу различать щелчок, ввод с клавиатуры/вкладки и ручной (с помощью кода) триггер.
Как я могу это сделать?
Я смотрю на объект события, но не вижу ничего полезного.
Мне нужно определить, что вызвало событие фокуса.
В идеале я хочу различать щелчок, ввод с клавиатуры/вкладки и ручной (с помощью кода) триггер.
Как я могу это сделать?
Я смотрю на объект события, но не вижу ничего полезного.
Если фокус исходит от вызова $x.focus()
, то у события не будет свойства originalEvent
, потому что от браузера не было никакого события, поэтому:
if(ev.hasOwnProperty('originalEvent')) {
// Focus event was manually triggered.
}
Чтобы различать события фокуса клавиатуры и мыши, вы можете попробовать привязать обработчик keydown
ко всему остальному, чтобы обнаружить Tab или Shift-Tab, но это будет грубый взлом и вероятно, не надежный; например, на iPad вы не нажимаете Tab, чтобы перейти к следующему полю, вы нажимаете Далее или Назад во всплывающей клавиатуре. для перемещения, и они могут вообще не регистрироваться как нажатия клавиш.
Есть аналогичный вопрос о click
событиях, которые также могут представлять интерес:
В jQuery, как я могу сказать между программным кликом и кликом пользователя?
Как вы заметили в комментариях, вы можете перехватывать click
событий, чтобы обнаружить изменение фокуса на основе мыши и установить где-нибудь флаг, чтобы запомнить это. Тогда у вас будет это:
originalEvent
, то изменение фокуса было инициировано вручную (т. е. $x.focus()
или подобное).Вы должны быть осторожны, чтобы ваши события щелчка и фокусировки происходили в правильном порядке, и вам нужно убедиться, что флаг был снят, когда вы закончите с этим. Это может не быть пуленепробиваемым, но, может быть, это и не нужно.
.click
для обнаружения щелчков мышью, а затем обработчик .focus
с этим originalEvent
, чтобы различать события клавиатуры и триггера. Кажется, работает хорошо. Спасибо!
- person mpen; 18.07.2011
click
, вероятно, лучше, чем пытаться обнаружить события клавиатуры. Тогда отсутствие originalEvent
означает, что это было вызвано вручную, щелчок означает, что это было вызвано мышью, в противном случае это было с клавиатуры. Я добавлю это к своему ответу для дальнейшего использования.
- person mu is too short; 18.07.2011
click
происходит после события focus
. Однако событие mousedown
по-прежнему надежно происходит до focus
, поэтому вы можете перехватить его, чтобы определить причину фокуса.
- person DSimon; 26.03.2015
event.nativeEvent
.
- person Slbox; 09.03.2021