2009-12-11 6 views
6

Я привязываюсь к событию keydown с jQuery, чтобы разрешить некоторые конкретные символы в текстовом поле. Я пытаюсь сделать свой код кросс-браузером и платформой. Моя основная проблема заключается в том, что я не могу найти способ сопоставить полученный код ключа с допустимым кодом символа, особенно для кода ключа, поступающего с цифровой клавиатуры (десятичный разделитель, это кома или период и т. Д.).Javascript key code =/= char code

Заранее спасибо за помощь, Fabian

ответ

1

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

Я опубликовал jQuery plug-in для тех, кто заинтересован в решении.

6

Это правильно. Нет такого сопоставления, которое вы можете сделать; a keydown может даже не соответствовать вставленному символу. Или Caps Lock может изменить значение нажатия клавиши, и вы не можете нюхать за это. И various other wrinkles.

Если вы хотите знать код символа, единственным вариантом является использование события keypress.

+0

Это также мой вывод. Но, согласно http://www.quirksmode.org/js/keys.html, кажется, что Firefox не корректно обрабатывает событие нажатия клавиши. Я немного застрял в этой проблеме: -/ –

+0

Еще одна вещь о keypress, я получаю тот же код за период И ключ удаления (не backspace): 46. Это огромная проблема для меня :( Использование английский Windows XP, английский Firefox, бельгийская клавиатура, бельгийское картографирование. –

+3

Клавиша Firefox прекрасно, просто используйте обычное 'event.which' для получения символа. Затем добавьте резерв для поведения charCode-in-keyCode IE, например:' var c = 'which' в событии event.which: event.keyCode; ' – bobince

1

Ну, если ваша проблема заключается в переводе кодов клавиш на символы, почему бы не позволить браузеру обращаться с ним за вас? Это может показаться отвратительным, но вы можете просто разрешить браузеру изменять текстовое поле (так что удаление - это удаление, а период - период), а затем вернуться и отредактировать его ... Ум ... может быть, что-то вроде этого :

function hookEvents() { 
    $('#myTextBox').oldValue = $('#myTextBox').value; 
    $('#myTextBox').bind('keyup', function(event) { 
     // Maybe nothing's changed? 
     if (event.target.oldValue == event.target.value) { 
      return; 
     } 

     var validInput = /(\-?[0-9]*(?:\.[0-9]*)?)/; 
     var input = event.target.value; 
     var result = validInput.exec(input); 
     if (result.index != 0 || result[result.length-1] != input.length) 
     { 
      event.target.value = result[0]; 
     } 

     // update for later 
     event.target.oldValue = event.target.value; 
    }); 
} 

Самая большая проблема с этим подходом заключается в том, что каждая нажатая клавиша появляется на экране на мгновение. С другой стороны, с REGEX у вас намного больше контроля над форматом допустимого ввода. В приведенном выше примере я допускаю только положительные или отрицательные числа (с необязательной десятичной точкой). Например: «123», «-123», «-123.456», «123.456».

Я знаю, что это не отвечает на ваш вопрос, но это полностью обходит проблему!

+0

Интересно, но, как вы сказали, персонаж будет сначала аппарировать в текстовое поле. Этого я не хочу иметь. –