Вопрос по keyboard, javascript – нажатие клавиш и keyup - почему keyCode отличается?

42

Связанные с:JavaScript KeyCode против CharCode

Вот код, который вы можете попробовать дома или вjsfiddle:

el.addEventListener( 'keyup', function( e ) { 
    console.log( 'Keyup event' );
    console.log( e.keyCode );
} ); 
el.addEventListener( 'keypress', function( e ) { 
    console.log( 'Keypress event' );
    console.log( e.keyCode );
} );

Почему ключевой код отличается?

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

PS: я не беспокоюсь о поддержке устаревших браузеров, я пробовал это в Chrome и был удивлен и не смог найти объяснения.

ВопросonKeyPress Vs. onKeyUp and onKeyDown является несколько связанным и может быть интересным чтением. Frank Tan

Ваш Ответ

3   ответа
45

keyup а такжеkeydown для идентификации физических ключей иkeypress для идентификации набранных символов. Это принципиально разные задачи с разными событиями; не пытайтесь смешать два. Особенно,keyCode наkeypress события обычно избыточны и не должны использоваться (за исключением более старого IE, но для получения дополнительной информации см. приведенный ниже документ); для печатных нажатий клавиш оно обычно такое же, какwhich а такжеcharCodeХотя между браузерами есть некоторые различия.

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

Я понимаю, что цели разные, но это не отвечает тому факту, что код ключа отличается, даже еслиkeys подобные. Florian Margaine
@FlorianMargaine: на странице Яна Вольтера есть таблицы, показывающие, что каждое свойство возвращает для каждого события. Для WebKit (и действительно для большинства браузеров сейчас),keyCode возвращает так же, какwhich а такжеcharCode заkeypress события, то есть код символа, соответствующий набранному символу, а не код клавиши нажатой клавиши (как вkeyup а такжеkeydown).
Мне пришлось внимательно прочитать статью для этой части:On keydown and keyup events, the keycodes are not character codes, and this conversion will give wild results for many keys. There is no general portable way to convert keycodes to characters. You pretty much have to sense the browser type and base the key mapping on that. I don't have information on keycodes sent by international keyboards. :) спасибо за ваш ответ, кстати! Florian Margaine
2

хорошая статья на quirksmode.org отвечая именно на этот вопрос. Вы также можете посмотреть наРезультаты Unixpapa.

Таким образом, они должны дать тот же код ключа. Почему они не зависят от события? Florian Margaine
Это одна и та же клавиша на клавиатуре, только с разными модификаторами (сдвиг). Keyup / down для нажатия клавиш, нажатие клавиши для набираемого текста.
Причудливый режим особенно говорит:for instance, a lower case 'a' and an upper case 'A' have the same keyCodeвот почему я не понимаю. Я что-то пропустил? Вторая статья связана в связанном вопросе :) Florian Margaine
Нет, вверх и вниз должны дать одинаковый код клавиши, нажмитеshould дают 0. Но IE, Opera и, по-видимому, Chrome выдают charCode при нажатии как «keyCode».
0

я наткнулся на одно различие, когда пытался скопировать запись пользователя из одного ввода формы в какую-то другую часть формы, которую я заблокировал для редактирования пользователями. Я обнаружил, что всякий раз, когда пользователь переходил к следующей метке с помощью клавиши после завершения ввода, в копируемой записи пропускалась одна последняя запись клавиатуры, когда я использовал eventListener для нажатия клавиши, и это решалось при использовании keyup.

Итак, в заключение Keypress прослушивает состояние в тот момент, когда клавиша была нажата,leaving aside the result of keypressв то время как keyup прослушивает состояние системы после нажатия клавиши иincludes the result of the keypress.

Похожие вопросы