Почему люди пишут оператор вроде
e.keyCode ? e.keyCode : e.charCode
Некоторые люди также используют e.which
Может кто-нибудь объяснит?
Почему люди пишут оператор вроде
e.keyCode ? e.keyCode : e.charCode
Некоторые люди также используют e.which
Может кто-нибудь объяснит?
Обработка ключевых событий последовательно не всегда легко.
Во-первых, существуют два разных типа кодов: коды клавиатуры (число, обозначающее клавишу на клавиатуре, которую пользователь нажал) и коды символов (число, обозначающее символ Unicode). Вы можете только надежно получить коды символов в событии keypress
. Не пытайтесь получить коды символов для событий keyup
и keydown
.
Во-вторых, вы получаете разные наборы значений в событии keypress
для того, что вы получаете в событии keyup
или keydown
.
Я рекомендую эту страницу в качестве полезного ресурса. В резюме:
Если вы заинтересованы в обнаружении пользователя, набравшего символ, используйте событие keypress
. IE странно только сохраняет код символа в keyCode
, а все остальные браузеры хранят его в which
. Некоторые (но не все) браузеры также хранят его в charCode
и/или keyCode
. Пример обработчика нажатия клавиш:
function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
alert(charStr);
}
Если вы заинтересованы в обнаружении непечатаемого ключа (например, клавиши курсора), используйте событие keydown
. Здесь keyCode
всегда является свойством использования. Обратите внимание, что события keyup
имеют одинаковые свойства.
function(evt) {
evt = evt || window.event;
var keyCode = evt.keyCode;
// Check for left arrow key
if (keyCode == 37) {
alert("Left arrow");
}
}
Это условное утверждение.
Если браузер отключает e.keyCode, тогда возьмите e.keyCode else e.charCode.
Он похож на
var code = event.keyCode || event.charCode
event.keyCode: возвращает значение Unicode несимвольной клавиши в событии нажатия клавиши или любой клавише любого другого типа клавиатуры событие.
event.charCode: возвращает значение Unicode символьной клавиши, нажатой во время события нажатия клавиши.
keyCode и которые представляют собой фактическую клавишу клавиатуры, нажатую в виде числового значения. Причина в том, что keyCode доступен в Internet Explorer, в то время как доступен в браузерах W3C, таких как FireFox.
charCode похож, но в этом случае вы извлекаете значение Unicode символа. Например, буква "A."
Выражение JavaScript:
var keyCode = e.keyCode ? e.keyCode : e.charCode;
По существу говорится следующее:
Если свойство e.keyCode существует, установите для него значение keyCode. В противном случае установите переменную keyCode в значение свойства e.charCode.
Обратите внимание, что получение свойств keyCode или charCode обычно связано с выяснением различий между моделями событий в IE и W3C. Некоторые влечет за собой написание кода следующим образом:
/*
get the event object: either window.event for IE
or the parameter e for other browsers
*/
var evt = window.event ? window.event : e;
/*
get the numeric value of the key pressed: either
event.keyCode for IE for e.which for other browsers
*/
var keyCode = evt.keyCode ? evt.keyCode : e.which;
ИЗМЕНИТЬ: Исправления к моему объяснению charCode в соответствии с комментариями Tor Haugen.
Хорошо, вот объяснения.
e.keyCode - используется для получения номера, представляющего ключ на клавиатуре
e.charCode - номер, представляющий символ юникода ключа на клавиатуре
e.which - (специфичный jQuery) - это свойство, введенное в jQuery (DO не используется в простом javascript)
Ниже приведен фрагмент кода для получения keyCode и charCode
<script>
// get key code
function getKey(event) {
event = event || window.event;
var keyCode = event.which || event.keyCode;
alert(keyCode);
}
// get char code
function getChar(event) {
event = event || window.event;
var keyCode = event.which || event.keyCode;
var typedChar = String.fromCharCode(keyCode);
alert(typedChar);
}
</script>
Живой пример Получение keyCode и charCode в JavaScript.
I (будучи самим собой) написал этот оператор, потому что я хотел обнаружить ключ, который пользователь набрал на клавиатуре в разных браузерах.
Например, в firefox символы имеют > 0 charCode и 0 keyCode, а такие клавиши, как стрелки и обратное пространство, имеют > 0 keyCode и 0 charCode.
Однако использование этого утверждения может быть проблематичным, поскольку возможны "столкновения". Например, если вы хотите различать клавиши "Удалить" и "Период", это не будет работать, так как у Delete есть keyCode = 46, а Period имеет charCode = 46.
При использовании jQuery добавляется свойство event.which
, чтобы избежать различий браузера. См. документы.
Свойство which
будет undefined, если вы не используете jQuery.