Согласно MDN, мы определенно не должны использовать это .keyCode
свойство. Устарело:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
В школе W3 этот факт преуменьшается, и есть только примечание сбоку, в котором говорится, что .keyCode
оно предоставляется только для совместимости и что последняя версия спецификации событий DOM рекомендует использовать .key
вместо этого свойство.
Проблема в том, что .key
это не поддерживается браузерами, так что же нам использовать? Что-то мне не хватает?
javascript
key
deprecated
keycode
Джейсон210
источник
источник
.key
поддерживается во всех основных браузерах developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/…Ответы:
У вас есть три способа справиться с этим, как написано в ссылке, которой вы поделились.
if (event.key !== undefined) { } else if (event.keyIdentifier !== undefined) { } else if (event.keyCode !== undefined) { }
вам стоит задуматься о них, это правильный путь, если вам нужна кроссбраузерная поддержка.
Было бы проще, если бы вы реализовали что-то вроде этого.
var dispatchForCode = function(event, callback) { var code; if (event.key !== undefined) { code = event.key; } else if (event.keyIdentifier !== undefined) { code = event.keyIdentifier; } else if (event.keyCode !== undefined) { code = event.keyCode; } callback(code); };
источник
Кроме того, все keyCode , которые , charCode и keyIdentifier устарели:
charCode
иkeyIdentifier
являются нестандартными функциями.keyIdentifier
удаляется с Chrome 54, а Opera 41.0keyCode
возвращает 0 при нажатии клавиши с обычными символами на FF.Ключевое свойство :
На момент написания этой статьи
key
свойство поддерживается всеми основными браузерами, начиная с: Firefox 52, Chrome 55, Safari 10.1, Opera 46. За исключением Internet Explorer 11, который имеет: нестандартные идентификаторы ключей и неправильное поведение с AltGraph. Дополнительная информацияЕсли это важно и / или имеет обратную совместимость, вы можете использовать обнаружение функций, как в следующем коде:
Обратите внимание, что
key
значение отличается отkeyCode
илиwhich
свойств в этом: оно содержит имя ключа, а не его код. Если вашей программе нужны коды символов, вы можете использоватьcharCodeAt()
. Для одиночных печатных символов вы можете использоватьcharCodeAt()
, если вы имеете дело с ключами, значения которых содержат несколько символов, например, ArrowUp вероятность: вы проверяете специальные ключи и принимаете соответствующие меры. Так попробовать реализовать таблицу значений " ключи и соответствующие им кодыcharCodeArr["ArrowUp"]=38
,charCodeArr["Enter"]=13
,charCodeArr[Escape]=27
... и так далее, пожалуйста , обратите внимание на ключевые ценности и их соответствующих кодовif(e.key!=undefined){ var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); }else{ /* As @Leonid suggeted */ var characterCode = e.which || e.charCode || e.keyCode || 0; } /* ... code making use of characterCode variable */
Может быть, вы захотите рассмотреть возможность прямой совместимости, то есть использовать устаревшие свойства, пока они доступны, и только после сброса переключаться на новые:
if(e.which || e.charCode || e.keyCode ){ var characterCode = e.which || e.charCode || e.keyCode; }else if (e.key!=undefined){ var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); }else{ var characterCode = 0; }
См. Также: документацию по
KeyboardEvent.code
свойствам и некоторые дополнительные сведения в этом ответе .источник
charCodeArr
функции не существует. Кроме того,charCodeAt
не работает для всех значенийe.key
. Например, для ключаEnter
/Return
значениеe.key
свойства равно"Enter"
, и выполнениеcharCodeArr
для этой строки возвращает значение69
(которое является кодом ASCII для символаE
).TLDR: Я хотел бы предложить , что вы должны использовать новый
event.key
иevent.code
свойство вместо устаревших единиц. IE и Edge поддерживают эти свойства, но пока не поддерживают новые имена ключей. Для них есть небольшой полифилл, который заставляет их выводить стандартные имена ключей / кодов:https://github.com/shvaikalesh/shim-keyboard-event-key
Я пришел к этому вопросу в поисках причины того же предупреждения MDN, что и OP. После еще нескольких поисков проблема с
keyCode
становится более ясной:Проблема с использованием
keyCode
неанглийских клавиатур может давать разные результаты, и даже клавиатуры с разной раскладкой могут давать противоречивые результаты. Плюс был случайЕсли вы читали спецификацию W3C: https://www.w3.org/TR/uievents/#interface-keyboardevent
Здесь подробно описывается, что было не так
keyCode
: https://www.w3.org/TR/uievents/#legacy-key-attributesИтак, установив причину замены устаревшего keyCode, давайте посмотрим, что вам нужно сделать сегодня:
key
иcode
).источник
KeyboardEvent.code
. Кроме того, значенияkey
иcode
зависят от браузера. Обе проблемы создаютkey
иcode
не подходят для использования в реальных приложениях.key
илиcode
? Обычно это физическая клавиша, но это может зависеть также от Num Lock и раскладки ... Какая наилучшая практика?MDN уже предоставил решение:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
window.addEventListener("keydown", function (event) { if (event.defaultPrevented) { return; // Should do nothing if the default action has been cancelled } var handled = false; if (event.key !== undefined) { // Handle the event with KeyboardEvent.key and set handled true. } else if (event.keyIdentifier !== undefined) { // Handle the event with KeyboardEvent.keyIdentifier and set handled true. } else if (event.keyCode !== undefined) { // Handle the event with KeyboardEvent.keyCode and set handled true. } if (handled) { // Suppress "double action" if event handled event.preventDefault(); } }, true);
источник
key
это строковое значение, зависящее от браузера, например"Enter"
или,"ArrowUp"
и не существует стандартизированного способа его преобразования в соответствующий код. так что вам понадобится еще больше шаблонного кода для преобразования между ключом и кодом.Например, если вы хотите определить, была ли нажата клавиша «Enter» или нет:
Вместо того
event.keyCode === 13
Сделай это как
event.key === 'Enter'
источник