Я думал, что на это ответят где-нибудь в переполнении стека, но я не могу его найти.
Если я слушаю событие нажатия клавиши, должен ли я использовать .keyCode
или .which
определить, была ли нажата клавиша Enter?
Я всегда делал что-то вроде следующего:
$("#someid").keypress(function(e) {
if (e.keyCode === 13) {
e.preventDefault();
// do something
}
});
Но я вижу примеры, которые используют .which
вместо .keyCode
. Какая разница? Один кросс-браузер более дружественный, чем другой?
javascript
jquery
ScottE
источник
источник
Ответы:
Примечание: ответ ниже был написан в 2010 году. Здесь много лет спустя оба
keyCode
иwhich
устарели в пользуkey
(для логического ключа) иcode
(для физического размещения ключа). Но обратите внимание, что IE не поддерживаетcode
, и его поддержкаkey
основана на более старой версии спецификации, поэтому не совсем корректна. Пока я пишу это, текущий Edge, основанный на EdgeHTML и Chakra, тоже не поддерживаетcode
, но Microsoft выпускает замену Edge на основе Blink и V8 , которая, вероятно, делает / будет.Некоторые браузеры используют
keyCode
, другие используютwhich
.Если вы используете jQuery, вы можете надежно использовать его,
which
поскольку jQuery стандартизирует вещи ; Больше здесь.Если вы не используете jQuery, вы можете сделать это:
Или в качестве альтернативы:
... который обрабатывает вероятность того, что
e.which
может быть0
(путем восстановления , что0
в конце концов, с помощью любопытно всесильный в JavaScript||
оператор ).источник
var key = event.which || event.keyCode;
что буду использовать,event.which
если оно определено, а не false, илиevent.keyCode
еслиwhich
undefined или false. Технически я, вероятно, должен делать,var key = typeof event.which === "undefined" ? event.keyCode : event.which;
но еслиevent.which
есть0
(может ли это быть0
?), Я вряд ли буду заботиться о том, что я делаю.which
, я думаю, что она предоставляется только jQuery, но я не уверен на 100%, но она поможет вам начать видеть различия в браузерах)which
предоставляетсяkeypress
всеми браузерами, кроме IE. И причудливый режим здесь не является авторитетным. Как ссылка, ссылка, которую разместил @TJ Crowder, намного лучше: unixpapa.com/js/key.html .which
свойство события может быть нулевым, и это может иметь большое значение для большинства приложений. Например, непечатаемые ключи в Firefox имеютwhich
нулевое свойство и такое жеkeyCode
свойство, какkeydown
. НаkeyCode
моем ПК клавиша Home имеет значение 36, что представляет собой код символа «$», что делает невозможным различение пользователя, нажимающего клавишу Home, и пользователя, набирающего символ $ с помощьюevent.which || event.keyCode
.jQuery нормализуется в
event.which
зависимости от тогоevent.which
, поддерживается ли браузерevent.keyCode
илиevent.charCode
поддерживается:Дополнительным преимуществом
.which
является то, что jQuery делает это и для щелчков мышью:источник
var key = event.which || event.charCode || event.keyCode
event.wich == null && ...
проверка на нулевое значение или неопределенное значение. вашevent.wich || ...
тест на ложность (неопределенный, ноль , ложь, 0, '' и т. д.)0
. И я не думаю, что проверять""
или[]
болит.Если вы находитесь в обычном Javascript, обратите внимание, что keyCode устарел и будет удален:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Вместо этого можно использовать: .key или .code в зависимости от того, какое поведение вы хотите: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en -US / документы / Web / API / KeyboardEvent / ключ
Оба реализованы в современных браузерах.
источник
key
вместоcode
. Например, если у вас есть клавиатура с клавишами управления мультимедиа, нажатие кнопки «Воспроизведение / Пауза» выводит «MediaPlayPause» дляkey
и «» дляcode
.посмотрите на это: https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode
В случае нажатия клавиши значение Unicode нажатой клавиши сохраняется в свойстве keyCode или charCode, но не в обоих. Если нажатая клавиша генерирует символ (например, «a»), charCode устанавливается на код этого символа с учетом регистра букв. (т.е. charCode учитывает, удерживается ли клавиша Shift). В противном случае код нажатой клавиши сохраняется в keyCode. keyCode всегда устанавливается в событиях keydown и keyup. В этих случаях charCode никогда не устанавливается. Чтобы получить код ключа независимо от того, был ли он сохранен в keyCode или charCode, запросите свойство which. Символы, введенные через IME, не регистрируются через keyCode или charCode.
источник
Я бы порекомендовал в
event.key
настоящее время. Документы MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyevent.KeyCode
иevent.which
оба имеют непристойные предупреждения в верхней части своих страниц MDN:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode https://developer.mozilla.org/en-US / документы / Web / API / KeyboardEvent / который
Для буквенно-цифровых ключей,
event.key
кажется, реализован одинаково во всех браузерах. Для управляющих клавиш (tab, enter, escape и т. Д.)event.key
Имеет одинаковое значение в Chrome / FF / Safari / Opera, но другое значение в IE10 / 11 / Edge (IE, по-видимому, используют более старую версию спецификации, но соответствуют друг другу как от 14 января 2018 г.)Для буквенно-цифровых ключей проверка будет выглядеть примерно так:
Для управляющих символов вам нужно сделать что-то вроде:
Я использовал приведенный здесь пример для тестирования в нескольких браузерах (мне пришлось открыть в codepen и отредактировать, чтобы он работал с IE10): https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ код
event.code
упоминается в другом ответе как возможность, но IE10 / 11 / Edge не реализуют его, поэтому он отсутствует, если вам нужна поддержка IE.источник
Надежная библиотека Javascript для ввода ввода с клавиатуры и введенных комбинаций клавиш. У него нет зависимостей.
http://jaywcjlove.github.io/hotkeys/
горячие клавиши понимает следующие модификаторы:
⇧
,shift
,option
,⌥
,alt
,ctrl
,control
,command
, и⌘
.Следующие специальные клавиши можно использовать для быстрого доступа:
backspace
,tab
,clear
,enter
,return
,esc
,escape
,space
,up
,down
,left
,right
,home
,end
,pageup
,pagedown
,del
,delete
иf1
черезf19
.источник
event.keyCode
.В Firefox свойство keyCode не работает с событием onkeypress (возвращает только 0). Для кросс-браузерного решения используйте свойство which вместе с keyCode, например:
источник