.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.