CB's blog

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. Это моя первая запись в моем первом блоге так что не будьте слишком строгими :) .

Комментарии (4) на “keyFilter. Фильтрация ввода (X)HTML форм”

  1. Ragnar:

    Стоит добавить что валидировать данные на сервере все равно всегда надо, так как отправку формы очень легко эмулировать с помощью хотя бы того же fsockopen().

  2. svoloshyn:

    Да, конечно это так. Вообще стоит добавит что по той же причине все клиентские проверки - скорее забота о клиенте, чем собственно проверка данных. Просто ЖС будет экономить ользователю траффик, время и нервы. А серверную часть проверок (обязательную), но тоже с разными вариантами реализации я даже не берусь пока описывать.

  3. Alex Mauzon:

    Во блин, а мужики-то не знают! ;)

    На самом деле как я уже убедился эту функцию имеет смысл использовать только в конкретно количественных полях, иначе пользователь теряется и начинает бояться заполнять форму вообще…
    А за обновление спасибо, если Вы не против, я себе в тот же пост его сопру :)

  4. svoloshyn:

    Не против конечно.
    Кстати скрипту не помешают еще улучшения - например если блокировать символы с кодом 0, то плохо то что не работают многие глобальные хоткеи, а если не блокировать, то можно вводить “запрещенные” символы например через Ctrl+Insert.
    Вообще, можно бы добавить чтото типа ErrorProvider’a из .Net для подсвечивания глюков ввода.

Добавить комментарий