event.keycode не возвращает правильные значения в firefox - PullRequest
18 голосов
/ 07 сентября 2011

Я пытаюсь использовать следующий код для запуска метода js при нажатии space-bar в поле ввода.

  <input id="j1" /> 

  $('#j1').keypress (function (event){
       alert(event.keycode)
  });

В Firefox это возвращает правильное значение только при нажатии enter, значения, возвращаемые для других клавиш, равны 0 каждый раз. В IE / chrome это работает отлично.

Ответы [ 5 ]

26 голосов
/ 07 сентября 2011

В браузерах, отличных от IE, требуется свойство which или charCode в событии keypress, а не свойство keyCode. Событие keypress предназначено для обнаружения напечатанных символов, а keyup и keydown - для определения физических ключей (в этих случаях keyCode работает во всех основных браузерах).

var charCode = (typeof event.which == "number") ? event.which : event.keyCode;

Однако jQuery нормализует свойство which событий нажатия клавиш, используя код, подобный этому, поэтому в jQuery вам просто нужно

var charCode = event.which;

Подробнее о ключевых событиях см. http://unixpapa.com/js/key.html.

7 голосов
/ 07 сентября 2011

Проблема не во всех браузерах с одинаковыми реализациями при нажатии клавиш.Решением было бы проверить все возможные места, где был зарегистрирован key.В этом случае: event.keycode и event.which

См. Этот пост для получения дополнительной информации

jQuery Event Keypress: какая клавиша была нажата?

РЕДАКТИРОВАТЬ

Наконец, откопал мои старые функции, вот код, который я использую:

evt = (evt) ? evt : event;
var charCode = evt.which || evt.charCode || evt.keyCode || 0;
2 голосов
/ 07 апреля 2017

IF "event.keyCode" не возвращает правильные значения, тогда для firefox вы можете использовать " event.charCode"

var keyValue = event.charCode || event.keyCode;

1 голос
/ 19 августа 2017

KeyboardEvent.keyCode:

Значение события нажатия клавиши отличается в разных браузерах.IE и Google Chrome устанавливают значение KeyboardEvent.charCode.Gecko устанавливает 0, если нажатая клавиша является клавишей для печати, в противном случае он устанавливает тот же код клавиши, что и событие keydown или keyup

Так что с точки зрения Firefox он фактически вернул правильные значения.См. документы .

keyCode, which, keyIdentifier и charCode устарели

Эта функция удалена из веб-стандартов.Хотя некоторые браузеры все еще могут поддерживать его, он находится в процессе удаления.Избегайте его использования и обновляйте существующий код, если это возможно;

keyIdentifier не поддерживал IE и Firefox и был удален из Opera и Chrome
с charCode как нестандартный

Эта функция нестандартна и не соответствует стандарту.Не используйте его на рабочих сайтах, выходящих в Интернет: он не будет работать для каждого пользователя.Также могут быть большие несовместимости между реализациями

Так каковы альтернативы?

I.Вместо этого используйте свойство key

readonly attribute DOMString key

Содержит значение атрибута клавиши, соответствующее нажатой клавише

Примеры: "a", "A", "@","% "," $ "," ا "," ب "," ة "," ت ", ...," ١ "," ٢ "," ٣ "," Tab "," Enter ",все "F1" ... `

Он заслужил поддержку всех основных браузеров (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 ... и т. Д., Пожалуйста, посмотрите на Key Values ​​ и их , соответствующиекоды

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  */  

II. Вы также можете использовать свойство code:

readonly attribute DOMString code

Содержит строку, идентифицирующую физическую нажатую клавишу,На значение не влияет текущая раскладка клавиатуры или состояние модификатора, поэтому определенная клавиша всегда будет возвращать одно и то же значение.

Это имеет эффект, аналогичный свойству key и выводу типа "keyW" для кнопки W, нажатой на клавиатуре США с раскладкой QUERTY.Если бы та же кнопка была нажата в другом макете (AZERTY) или другом языке (иврит) или в сочетании с модификатором (shift), свойство key изменилось бы соответствующим образом, в то время как свойство code все равно будет иметь то же значение "keyW"подробнее об этом здесь .

Свойство code поддерживается в Chrome 49, Firefox 52, Safari 10.1 и Opera 46, но не в Internet Explorer.

см. также:

  1. KeyboardEvent.charCode
  2. KeyboardEvent.keyIdentifier
  3. KeyboardEvent.keyCode
  4. KeyboardEvent.which
  5. KeyboardEvent.key
  6. поддержка свойств ключа
  7. KeyboardEvent.code
  8. поддержка свойств кода
0 голосов
/ 10 января 2019

если вы получаете 0 независимо от того, какую клавишу вы нажимаете, попробуйте использовать charCode вместо keyCode

Это происходит потому, что вы вызываете объект KeyboardEvent, который использует which и charCode, в отличие от объекта Event, который использует keyCode для возврата значений Unicode клавиатуры. Для получения дополнительной информации обратитесь к веб-документам MDN для получения дополнительной информации о KeyboardEvent: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

...