.keyCode против .which
Я думал, что на это будет где-то ответ на Stack Overflow, но я не могу его найти.
Если я прослушиваю событие keypress, должен ли я использовать .keyCode
или .which
, чтобы определить, была ли нажата клавиша Enter?
Я всегда делал что-то вроде следующего:
$("#someid").keypress(function(e) {
if (e.keyCode === 13) {
e.preventDefault();
// do something
}
});
Но я вижу примеры, которые используют .which
вместо .keyCode
. Какая разница? Является ли еще один кросс-браузер дружественным, чем другой?
Ответы
Ответ 1
В некоторых браузерах используется keyCode
, другие используют which
. Если вы используете jQuery, вы можете надежно использовать which
, поскольку jQuery стандартизирует вещи. Подробнее здесь.
Если вы не используете jQuery, вы можете сделать это:
var key = 'which' in e ? e.which : e.keyCode;
Или поочередно:
var key = e.which || e.keyCode || 0;
... который обрабатывает возможность того, что e.which
может быть 0
(путем восстановления этого 0
в конце, используя JavaScript любопытно-мощный ||
).
Ответ 2
jQuery нормализует event.which
в зависимости от того, поддерживается ли event.which
, event.keyCode
или event.charCode
браузером:
// Add which for key events
if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
event.which = event.charCode != null ? event.charCode : event.keyCode;
}
Дополнительным преимуществом .which
является то, что jQuery делает это также для щелчков мыши:
// Add which for click: 1 === left; 2 === middle; 3 === right
// Note: button is not normalized, so don't use it
if ( !event.which && event.button !== undefined ) {
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
}
Ответ 3
посмотрите на это: https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode
В событии нажатия клавиши значение Unicode нажатой клавиши сохраняется в свойстве keyCode или charCode, и никогда. Если нажатая клавиша генерирует символ (например, "a" ), charCode устанавливается в код этого символа, соблюдая регистр букв. (т.е. charCode учитывает, удерживается ли клавиша сдвига). В противном случае код нажатой клавиши сохраняется в keyCode.
keyCode всегда устанавливается в событиях keydown и keyup. В этих случаях charCode никогда не устанавливается.
Чтобы получить код ключа независимо от того, был ли он сохранен в keyCode или charCode, запросите какое свойство.
Символы, введенные через IME, не регистрируются через keyCode или charCode.
Ответ 4
Если вы находитесь в ванильном 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/docs/Web/API/KeyboardEvent/key
Оба реализованы в современных браузерах.
Ответ 5
Введена надежная библиотека Javascript для ввода ввода клавиатуры и комбинаций клавиш. У него нет зависимостей.
http://jaywcjlove.github.io/hotkeys/
hotkeys('ctrl+a,ctrl+b,r,f', function(event,handler){
switch(handler.key){
case "ctrl+a":alert('you pressed ctrl+a!');break;
case "ctrl+b":alert('you pressed ctrl+b!');break;
case "r":alert('you pressed r!');break;
case "f":alert('you pressed f!');break;
}
});
горячие клавиши понимают следующие модификаторы: ⇧
, 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
.