На этом шаге мы рассмотрим обработку незаполненных условно-обязательных полей.
Для условно-обязательных полей желательно создать немного иное сообщение, информирующее о том, что поле обязательно, только когда отмечен соответствующий флажок. Мы будем добавлять квалифицирующее сообщение в конец стандартного сообщения об ошибке. Для этого добавим еще одну условную инструкцию if, которая будет проверять наличие класса conditional только в случае выполнения двух первых условий:
$(document).ready(function() { $('form :input').blur(function() { if ($(this).hasClass('required')) { var $listItem = $(this).parents('li:first'); if (this.value == '') { var errorMessage = 'Это обязательное поле'; if ($(this).is('.conditional')) { errorMessage += ', когда установлен флажок'; } $('<span></span>') .addClass('error-message') .text(errorMessage) .appendTo($listItem); $listItem.addClass('warning'); } } }); });
Когда поле ввода теряет фокус ввода в первый раз, наш программный код прекрасно справляется со своими обязанностями; однако, когда пользователь повторно входит в поле ввода и выходит из него, возникают две проблемы, как показано на рисунке 1.
Рис.1. Многократное повторение текста сообщения об ошибке
Полный текст этого примера можно взять здесь.Если поле по-прежнему остается незаполненным, сообщение об ошибке будет повторено столько раз, сколько раз пользователь будет покидать поле. Если пользователь заполнит поле, класс class="warning" не будет удален. Безусловно, нам необходимо, чтобы рядом с полем выводилось только одно сообщение, и нам требуется удалить сообщение, когда пользователь исправит ошибку. Ликвидировать обе проблемы можно удалением класса class= "warning" из родительского элемента <li> текущего поля и <span class="error-message"> из того же элемента <li> всякий раз, когда поле теряет фокус ввода, непосредственно перед выполнением проверки:
$(document).ready(function() { $('form :input').blur(function() { $(this).parents('li:first').removeClass('warning') .find('span.error-message').remove(); if ($(this).hasClass('required')) { var $listItem = $(this).parents('li:first'); if (this.value == '') { var errorMessage = 'Это обязательное поле'; if ($(this).is('.conditional')) { errorMessage += ', когда установлен флажок'; } $('<span></span>') .addClass('error-message') .text(errorMessage) .appendTo($listItem); $listItem.addClass('warning'); } } }); });
Наконец, мы получили функционирующий сценарий проверки обязательных и условно-обязательных полей. Даже после повторного входа и выхода из обязательного поля сообщение об ошибке отображается корректно.
Заметим также, что нам необходимо также удалять класс warning и <span class="error-message"> из элемента <li>, когда пользователь снимает соответствующий флажок! Для реализации этого мы можем вернуться к программному коду, обрабатывающему флажки, и добавить в него запуск события blur для соответствующего поля ввода в случае снятия флажка:
$(document).ready(function() { $('input.conditional').next('span').andSelf().hide() .end().end() .each(function() { var $thisInput = $(this); var $thisFlag = $thisInput.next('span'); $thisInput.prev('label').find(':checkbox') .attr('checked', false) .click(function() { if (this.checked) { $thisInput.show().addClass('required'); $thisFlag.show(); $(this).parent('label').addClass('req-label'); } else { $thisInput.hide().removeClass('required').blur(); $thisFlag.hide(); $(this).parent('label').removeClass('req-label'); } }); }); });
Теперь, когда пользователь будет снимать флажок, соответствующий класс warning и сообщение об ошибке будут удаляться.
Рис.2. Теперь текст сообщения об ошибке выводится всего один раз
Полный текст этого примера можно взять здесь.На следующем шаге мы рассмотрим обязательные форматы.