2015-06-22 4 views
0

Я пишу несколько javascript для обработки ввода с клавиатуры. В какой-то момент в моем коде я делаю предположение, что keyCode for keyPress event != keyCode for keyDown event тогда и только тогда, когда клавиша сдвига удерживается.Является ли Shift единственным ключом, который может изменить значение keyCode?

Это правильное предположение? Или есть другие ключи, где это условие выполняется? В частности, меня беспокоят альтернативные раскладки клавиатуры, такие как AZERTY и QWERTZ.

+0

Как насчет клавиш CTRL и ALT? – Pointy

+0

Команда на mac? – Alp

+0

Это помогает предоставить реальный код, который вы написали – tvgemert

ответ

0

Предположение ошибочно. Видите ли, событие keydown запускается всякий раз, когда вы нажимаете клавишу. Событие keypress запускается только тогда, когда указанный ключ выводит печатный символ.

При этом, нажатие клавиши между a и z, например, "а" будет генерировать:

  1. keydown с KeyCode 65 (A)
  2. keypress с KeyCode 97 (а)

Таким образом, они не равны для общего случая. В то время как нажатие "SHIFT + A" будет генерировать:

  1. keydown с KEYCODE 16 (Shift)
  2. keydown с KEYCODE 65 (A)
  3. keypress с KEYCODE 65 (A)

Так они равны при нажатии клавиши сдвига.

Для цифровых клавиш поведение инвертируется. Нажатие кнопки "1" будет генерировать

  1. keydown с KEYCODE 49 (1)
  2. keypress с KEYCODE 49 (1)

Таким образом, они равны, не нажимая на клавишу, в то время как нажатие «SHIFT + 1" будет генерировать:

  1. keydown с KeyCode 16 (Сдвиг)
  2. keydown с KEYCODE 49 (1)
  3. keypress с KEYCODE 33 (!)

Таким образом, они не равны, когда нажата клавиша переключения.

Имея CAPS LOCK ON, по умолчанию устанавливаются буквы в верхний регистр, поэтому коды клавиш будут равны для keydown и keypress. CAPS LOCK не влияет на числовые клавиши, поэтому они будут иметь одинаковые коды клавиш для keydown и keypress.

Другие модификаторы событий, такие как CTRL, ALT и их комбинация с SHIFT, не будут генерировать печатные символы, поэтому, когда будет запущено событие keydown, произойдет событие keypress.

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

+0

Спасибо! Это потрясающе. – Brandon

 Смежные вопросы

  • Нет связанных вопросов^_^