У меня есть форма ввода, с которой я выполняю проверку на стороне клиента с помощью плагина проверки достоверности jQuery. Основное использование работает отлично, за исключением конкретного сценария:Группа ввода недопустимых значений
Форма разбивает поля ввода адреса, позволяя отдельные поля для номера улицы, имени, города, штата и почтового индекса. Сам адрес является необязательным вводом формы (пользователь может выбрать не вводить адрес), но я хочу убедиться, что если какое-либо из этих полей будет использовано, пользователю будет предложено ввести все поля.
Это работает, за исключением случая, когда кто-то входит в адрес и отправляет запросы, а затем решает указать адрес. Идеальное поведение в этом случае будет заключаться в том, что, как только текст во входных данных, которые они ввели, удаляется, чтобы группа адресов была не указана.
Вот текущий сценарий:
- Пользователь вводит информацию в только в одном поле ввода, например, название улицы.
- Кнопка отправки нажата.
- Плагин проверки достоверности выделяет другие адресные входы с сообщением об ошибке, указывающим полный адрес.
- Пользователь решает не вводить адрес и удаляет предыдущий ввод, например. стирает название улицы
- В идеале: Все другие выделенные адресные входы не подсвечиваются, и сообщение об ошибке удаляется. На самом деле: Выделенные адреса и сообщения остаются до отправки формы.
Это javascript который демонстрирует проблему и соответствующий JSFiddle.
$("form").validate({
errorClass: 'error',
errorElement: 'label',
submitHandler: function() {
alert("Form submitted");
return false;
},
groups: {
address: "streetNumber streetName city state zipcode"
},
rules: {
streetNumber: {
required: {
depends: function(){
return $("#streetName").val() != '' || $("#city").val() != '' || $("#state").val() != '' || $("#zipcode").val() != '';
}
}
},
streetName: {
required: {
depends: function(){
return $("#streetNumber").val() != '' || $("#city").val() != '' || $("#state").val() != '' || $("#zipcode").val() != '';
}
}
},
city: {
required: {
depends: function(){
return $("#streetNumber").val() != '' || $("#streetName").val() != '' || $("#state").val() != '' || $("#zipcode").val() != '';
}
}
},
state: {
required: {
depends: function(){
return $("#streetNumber").val() != '' || $("#streetName").val() != '' || $("#city").val() != '' || $("#zipcode").val() != '';
}
}
},
zipcode: {
required: {
depends: function(){
return $("#streetNumber").val() != '' || $("#streetName").val() != '' || $("#city").val() != '' || $("#state").val() != '';
}
}
}
},
messages: {
streetNumber: {required: "Must provide full address"},
streetName: {required: "Must provide full address"},
city: {required: "Must provide full address"},
state: {required: "Must provide full address"},
zipcode: {required: "Must provide full address"}
},
highlight: function(element, errorClass, validClass) {
$(element).addClass(errorClass).removeClass(validClass);
},
unhighlight: function(element, errorClass, validClass) {
$(element).removeClass(errorClass);
},
errorPlacement: function(error, element) {
var n = element.attr("name");
if (n == "streetNumber" || n == "streetName" || n == "city" || n == "state" || n == "zipCode")
error.insertAfter("#zipcode");
}
});
Кроме того, пытаясь получить нужную функциональность блика, я также интересно, если есть более разумный способ для достижения «все или ничего» входные группы, которые не включают беспорядок условных операторов. Возможно, я могу использовать группу ввода формы?
Когда я помещал console.log() в функции выделения/невысоты, я замечаю, что когда я очищаю вход, они никогда не вызываются, поэтому, вероятно, это часть проблемы. – Corey
Вам понадобится функция обратного вызова 'unhighlight' для выполнения противоположной функции обратного вызова 'highlight'. Более того: '$ (element) .removeClass (errorClass) .addClass (validClass);' – Sparky
BTW, 'highlight/unhighlight' вызывается только при срабатывании или устранении ошибки. Другими словами, в то же время вы увидите сообщение об ошибке и исчезнет. – Sparky