Проверка на стороне клиента с использованием JavaScript не является чем-то новым, верно? Но можно использовать HTML DOM и расширить поля ввода с помощью специализированных атрибутов. Читай дальше!
Я предполагаю, что вы уже прочитали кучу статей по проверке формы, как на стороне клиента, так и на стороне сервера, но в этой статье есть новый поворот по этому вопросу. Здесь я собираюсь показать, как включить некоторые объектно-ориентированные программы в проверку формы. Так в чем же подвох? Этот совет работает с браузерами, поддерживающими JavaScript и HTML DOM от W3C, такими как Internet Explorer 6, Netscape 6 и Opera 6 и, в некоторой степени, более ранние версии. Хотя я не тестировал Konqueror, но, согласно спецификациям, он должен работать хорошо.
Справедливое предупреждение: вам нужно быть достаточно опытным с JavaScript, чтобы следовать этой статье.
Теги и объекты
Каждая форма имеет несколько входных тегов, которые обычно имеют атрибуты name и value. Текстовые поля также могут иметь размер и максимальный размер. В этой статье я добавил еще несколько атрибутов, которые вы обычно не найдете: pattern
и errorMsg
. Эти атрибуты нестандартны, но это не мешает браузерам. Для поклонников объектно-ориентированного программирования эти атрибуты действуют как члены класса, в данном случае класс является входным тегом.
Обычный входной тег:
<input type="text" name="firstname" size="20" maxsize="20" />
Модифицированный входной тег:
<input type="text" name="firstname" size="20" maxsize="20" pattern="[^A-Za-z]+" errorMsg="Invalid charcter found in firstname" />
Эквивалентный класс в Java:
public class Input { String type = "text"; String name = "firstname"; String size = "20"; String maxsize = "20"; String pattern = "[^A-Za-z]+"; String errorMsg = "Invalid character found in firstname"; }
Часто вам нужно написать функции для каждого поля ввода, которое вы хотите проверить. Но благодаря тому, что каждый входной тег «осведомлен» о его соответствии шаблону и сообщении об ошибке, код проверки гораздо проще написать. Фактически, в такой установке можно использовать универсальное решение, которое можно использовать для любого значения, которое можно описать с помощью регулярных выражений (для краткости RegExps). Ссылки на регулярные выражения см. В конце этой статьи.
DOM (объектная модель документа)
Большинство атрибутов представлены как объекты в DHTML, но эти добавленные атрибуты — нет. Таким образом, чтобы получить значения, нам нужно использовать DOM (ссылки на DOM приведены в конце в списке ресурсов). Полная HTML-страница, как и в DHTML, называется document
. Одним из методов, доступных для документа, является getElementsByTagName(String)
. Этот метод используется для поиска всех входных тегов:
var elements = document.getElementsByTagName('input');
Если бы elements
были обычным JavaScript-объектом, можно было бы догадаться, что это будет массив, содержащий все входные теги. Но не в DOM: здесь это NodeList
. В отличие от массива, в котором элемент myarray[i]
, в NodeList
есть коллекция items
(например, elements.item(i)
).
Затем мы можем перебрать все элементы, используя обычный цикл for:
for (var i = 0; i < elements.length; i++) {
Но теперь пришло время для атрибута pattern:
var pattern = elements.item(i).getAttribute('pattern');
Нам нужно получить шаблон для этого поля ввода, чтобы иметь возможность его проверить. В этой статье только обязательные элементы имеют атрибут pattern (проверка, как всегда, выполняется с помощью RegExps).
Поэтому мы берем значение из поля ввода и проверяем, не совпадают ли какие-либо символы с шаблоном. Другими словами, мы ищем оскорбительных персонажей.
var value = elements.item(i).value; var offendingChar = value.match(pattern);
И если мы найдем недопустимые значения, мы создадим сообщение об ошибке для пользователя:
str += elements.item(i).getAttribute('errorMsg') + "n" + "Found this illegal value: '" + offendingChar + "' n";
Чтобы немного помочь пользователю, давайте изменим цвет фона поля, содержащего недопустимый ввод (обратите внимание, что это не работает в Opera, но также не приносит никакого вреда).
elements.item(i).style.background ="red";
Как заметил наблюдательный читатель, value
в elements.item[i].value
представляется как объект. Но могло ли это быть достигнуто elements.item(i).getAttribute('value')
? Нет, это просто показывает значение по умолчанию (если есть) в теге, а не значение, введенное пользователем.
Вспомогательные функции
Есть две маленькие функции, которые я еще не упомянул. Во-первых, нам нужно убедиться, что браузер может обработать скрипт:
function DOMCheck() { if(!document.getElementsByTagName('html')) { alert("Sorry! Your browser does not support the W3C HTML DOM!"); } }
Это просто проверяет, есть ли элемент html
. Обратите внимание, что если теги <html>
опущены, Internet Explorer по-прежнему будет отображать страницу в формате HTML, но возвращаемое значение из сценария будет равно нулю, что приведет к неверному сообщению об ошибке. Таким образом, всегда будьте хороши и включайте теги <html>
в ваш документ.
Во-вторых, нам нужно очистить цвет фона, когда пользователь вводит новое значение в теги ввода:
function changeColor(th) { //'resets' the background-color to white th.style.background = "white"; }
Обратите внимание, что это не работает в Opera. Этот метод вызывается из тега ввода с использованием обработчика события 'onfocus'
.
Список источников
Полный список для нашей функции проверки выглядит следующим образом:
function validate() { var str = ""; var elements = document.getElementsByTagName('input'); // loop through all input elements in form for(var i = 0; i < elements.length; i++) { // check if element is mandatory; ie has a pattern var pattern = elements.item(i).getAttribute('pattern'); if (pattern != null) { var value = elements.item(i).value; // validate the value of this element, using its defined pattern var offendingChar = value.match(pattern); // if an invalid character is found or the element was left emtpy if(offendingChar != null || value.length == 0) { // add up all error messages str += elements.item(i).getAttribute('errorMsg') + "n" + "Found this illegal value: '" + offendingChar + "' n"; // notify user by changing background color, in this case to red elements.item(i).style.background = "red"; } } } if (str != "") { // do not submit the form alert("ERROR ALERT!!n" +str); return false; } else { // form values are valid; submit return true; } }
Дальнейшие расширения
Эта идея добавления атрибутов может быть расширена с помощью таких атрибутов, как минимальные и максимальные значения. Допустим, что RegExp недостаточно, и нам необходимо дополнительно определить данное значение:
Age: <input type="text" name="age" maxlength="2" size="2" min_reqs="18" max_reqs="30" errorMsg="Age must be 18-30 years" />
Продолжая использовать ту же идею, общий код проверки, который можно использовать для всех входных тегов, который использует минимальные / максимальные значения, добавив некоторую логику (в функции проверки) для этого элемента ввода.
var min_reqs = elements.item(i).getAttribute('min_reqs'); var max_reqs = elements.item(i).getAttribute('max_reqs'); if (min_reqs != null && max_reqs != null) { var value = elements.item(i).value; if (value < min_reqs || value > max_reqs) { str += elements.item(i).getAttribute('errorMsg') + 'n'; } }
Вывод
Это путь? Возможно, еще нет, но в самом ближайшем будущем, когда все или большинство пользователей будут использовать современный браузер. Конечно, есть и другие преимущества наличия унифицированной объектной модели (DOM) для браузеров, но этот небольшой совет немного облегчит веб-разработку.
Ресурсы
- Internet Explorer 6, часть I: поддержка стандартов DOM на веб-ссылке
- Обход таблицы HTML с интерфейсами JavaScript и DOM от Mozilla
- Веб-спецификации, поддерживаемые в Opera 4
- Регулярные выражения Стивен Рамсей
- Сопоставление с образцом и регулярные выражения на веб-ссылке
- Статистика браузера