keyFilter. Фильтрация ввода (X)HTML форм
Февраль 13, 2006
(X)HTML формы – довольно важная часть веб-дизайна и веб-программирования. В этой заметке я попробую рассказать о проверке данных, которые вводятся пользователями в формы. Лично я вижу 3 способа проверки:
Первый – послать все данные, на сервер и проверять все скриптом непосредственно перед записью в БД. Например так.
Второй – после submit’а формы проверять данные JavaScript’ом, и если данные неправильные то отменять submit, как это делают здесь.
Третий – фильтрация ввода в текстовые поля форм. Звучит необычно, но на самом деле все довольно просто. Идея (и часть кода) взята с сайта Mauzon и после некоторых небольших доработок, кстати согласованных с автором, я думаю, пора написать о нем более-менее подробно.
Вот весь код JavaScript (можно сохранить в файл, например keyfilter.js и потом подключить в документе):
var isIE = (document.all) ? 1 : 0;
function keyFilter(e, strPattern)
{
var chr = (isIE) ? e.keyCode : e.which;
var ch = String.fromCharCode(chr);
if (chr != 13 && chr != 8 && chr != 0)
{
var re = new RegExp(strPattern);
if (ch.search(re) == -1)
{
if(isIE)
e.returnValue = false;
else
e.preventDefault();
}
}
}
HTML-часть выглядит примерно так:
<input type="text" name="num" onkeypress="keyFilter(event,'[0-9]')" /> <input type="text" name="name" onkeypress="keyFilter(event,'[А-Яа-я]')" />
В первом случае для ввода допускаются только цифры, во втором - русские буквы. Как видно, второй аргумент функции keyFilter - regexp, регулярное выражение, более подробно можно узнать тут.
Теперь, когда у нас есть общая картина, мы можем смешивать вышеописанные три метода в нужных нам пропорциях в зависимости от конкретных задач.
Ну и ложечка дегтя. Существенным недостатком keyFilter’a есть его медлительность. Впрочем, попробовать стоит.
P.S. Это моя первая запись в моем первом блоге так что не будьте слишком строгими
.
Февраль 20th, 2006 в 6:40 pm
Стоит добавить что валидировать данные на сервере все равно всегда надо, так как отправку формы очень легко эмулировать с помощью хотя бы того же fsockopen().
Февраль 21st, 2006 в 11:01 am
Да, конечно это так. Вообще стоит добавит что по той же причине все клиентские проверки - скорее забота о клиенте, чем собственно проверка данных. Просто ЖС будет экономить ользователю траффик, время и нервы. А серверную часть проверок (обязательную), но тоже с разными вариантами реализации я даже не берусь пока описывать.
Апрель 4th, 2006 в 3:05 pm
Во блин, а мужики-то не знают!
На самом деле как я уже убедился эту функцию имеет смысл использовать только в конкретно количественных полях, иначе пользователь теряется и начинает бояться заполнять форму вообще…
А за обновление спасибо, если Вы не против, я себе в тот же пост его сопру
Апрель 4th, 2006 в 3:12 pm
Не против конечно.
Кстати скрипту не помешают еще улучшения - например если блокировать символы с кодом 0, то плохо то что не работают многие глобальные хоткеи, а если не блокировать, то можно вводить “запрещенные” символы например через Ctrl+Insert.
Вообще, можно бы добавить чтото типа ErrorProvider’a из .Net для подсвечивания глюков ввода.
Февраль 20th, 2009 в 7:13 am
Иногда можно фильтровать ввод и сразу по нажатию клавиши.
http://code.google.com/p/jquery-keyfilter/