onkeypress vs. onkeydown

Недавно пришлось прикручивать "умную" валидацию данных на клиенте через JavaScript. Заказчик захотел, чтобы в числовые поля нельзя было вбить нечисловые символы. Обычно (у нормальных людей) это делается так, чтобы при сабмите формы сгенерированный скрипт пробегался по полям - и подсвечивал (алертил, и т.п.) ошибки. Вначале был запрещен ввод пользователем не цифр. Работало это через onkeypress - там по event.charCode проверялся собственно код символа. Но тут за дело взялся тестер - и как всегда в подобных случаях предложил хуйню решение (запретить ctrl+v на поле, т.к. через него вставить не число можно), которое пришлось реализовывать.

И оказалось, что  onkeypress на ctrl+v вообще по-барабану - он его пропускает и ложит на все болт. Погуглив немного - переделал все под onkeydown - return !event.ctrlKey; И тут полетели странные баги - оказалось что фильтр, пропускавший только числа - теперь магическим образом пропускает и символы v,c,#,$ - причем только их.

И только по просшествии 2-х часов и около 5 переделок всего пришло откровение:

onkeypress - ложит болт на ctrl+v, однако коды символов приходят именно такими какими они есть

onkeydown - может отловить ctrl+v, однако коды символов - это коды нажатых клавишь! т.е. на раскладку ему тоже по-барабану

Так что если кому-нить нужно будет реализовать такую-же муть - пристрелите тестера нафиг надо юзать одновременно и то и то.

  • Alex

    Еще 1 момент может быть, если пользователь нажал вставку через контекстное меню(правой кнопкой мышки), также вставку можно сделать и через shift+insert


Информеры с тИЦ и PR: получить код для сайта