jQuery Validate: добавить ошибку или проверить класс в родительский div
Я использую Bootstrap Twitter в качестве основы для проекта, над которым я работаю. Я пытаюсь проверить форму с помощью jQuery проверки плагин, но это вызывает некоторые головные боли.
Я хочу добавить или действительный класс родитель div ввода каждой формы. Вот мой код:
<form id="msg-form" class="">
<fieldset>
<div class="input-prepend control-group pull-left">
<span class="add-on">@</span>
<input class="span3 required email" id="inputEmail" name="msg-email" type="text" placeholder="example@example.com">
</div>
<div class="input-prepend control-group pull-left">
<span class="add-on"><i class="icon-user"></i></span>
<input class="span3 required" id="inputName" name="msg-name" type="text" placeholder="Joe Bloggs">
</div>
<div class="input-prepend control-group">
<span class="add-on" style="height: 53px;"><i class="icon-pencil"></i></span>
<textarea class="span3 required" id="textarea" name="msg-comments" rows="2" style="height: 53px" placeholder="Just say hi, or tell us how we can help"></textarea>
</div>
<button type="submit" class="btn pull-right">Submit<i class="icon-chevron-right"></i></button>
</fieldset>
</form>
Как вы можете видеть мой div.контрольная группа это div, к которому я хочу добавить класс. Я попытались использовать выделить (как было предложено здесь, но это просто не работает) & errorPlacement (см. ниже), но я делаю это неправильно.
В идеале я хочу, чтобы класс был добавлен / удален на keyup таким образом, он сохраняет большую функциональность, которую предлагает плагин. Этот простой код работает, но он не удаляет класс и работает только при подаче формы:
$("#msg-form").validate({
errorPlacement: function(error, element) {
$(element).parent('div').addClass('error');
}
});
может ли кто-нибудь предложить, что вариант, который я должен использовать для достижения этого?!
заранее спасибо - я могу предоставить любые дополнительные сведения в необходимых случаях!
3 ответов
попробуйте использовать highlight
и unhighlight
функции:
$("#msg-form").validate({
highlight: function(element) {
$(element).parent('div').addClass('error');
},
unhighlight: function(element) {
$(element).parent('div').removeClass('error');
}
});
из моего ответа на добавить класс в родительский div, если ошибка проверки происходит с помощью проверки jquery потому что я считаю, что это добавляет ценность существующим ответам на этот вопрос ...
Настройки Валидатора Доступа
первым делом нужно изменить settings
объект в валидаторе формы. Вы можете сделать это любым из следующих способов:
- перед загрузкой формы для всех форм путем вызова
jQuery.validator.setDefaults()
- при инициализации формы, передавая в параметры
.validate([options])
- после инициализации путем размещения объекта валидатора в форме с
$("form").data("validator").settings
так как вы используете MVC, вариант #2 не может быть и речи, так как ненавязчивой проверки автоматически инициализирует форму. Итак, давайте использовать Вариант 3 вперед - цель здесь состоит в том, чтобы просто иметь возможность настройте параметры в форме.
Переопределить Поведение По Умолчанию
методы по умолчанию, которые мы хотим изменить, являются highlight
и unhighlight
что будет выделить недопустимые поля или отменить изменения, внесенные опцией выделения, соответственно. Вот их поведение по умолчанию согласно исходному коду:
highlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
} else {
$( element ).addClass( errorClass ).removeClass( validClass );
}
},
unhighlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
} else {
$( element ).removeClass( errorClass ).addClass( validClass );
}
}
Итак, у вас есть несколько вариантов здесь что ж.
- полностью замените эти функции и напишите их самостоятельно
- оберните эти функции и вызовите их как обычно, но добавьте свой собственный код до или после.
Вариант 1-Заменить Оптом
этот маршрут довольно легко. Просто напиши там все, что хочешь. Может быть, семя из исходного кода, может быть, сделать свое дело.
var valSettings = $("form").data("validator").settings
valSettings.highlight = function(element, errorClass, validClass) { ... }
valSettings.unhighlight = function(element, errorClass, validClass) { ... }
Вариант 2-Функции Wrap
это меньше навязчивая так, вероятно, предпочтительнее в большинстве случаев.
так как в конечном итоге вы будете заменять значение valSettings.highlight
, вам понадобится доступ к чистой нетронутой версии исходной функции. Вы можете сохранить свой собственный или захватить один из глобальных значений по умолчанию
// original highlight function
var highlightOriginal = $("form").data("validator").settings.highlight;
var highlightDefaults = $.validator.defaults.highlight
С точки зрения упаковки функций JavaScript есть несколько примеров здесь, здесь и здесь). Вот разбираемый пример из одного из тех, что будут помогите связать this
контекст между вызовами функций, сохраняет arity передаваемых аргументов и сохраняет возвращаемое значение:
function wrap(functionToWrap, beforeFunction) {
return function () {
var args = Array.prototype.slice.call(arguments),
beforeFunction.apply(this, args);
return functionToWrap.apply(this, args);
};
};
тогда вам также придется быстро определить любое дополнительное поведение, которое вы хотите запустить при каждом вызове. В этом случае давайте найдем ближайшего родителя div
к элементу и обновлению это такие классы:
function highlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(errorClass).removeClass(validClass);
}
Оборачивая Все Это (смотрите, что я сделал там)
$(function () {
var valSettings = $("form").data("validator").settings
valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator)
valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator)
});
function wrap(functionToWrap, beforeFunction) {
return function () {
var args = Array.prototype.slice.call(arguments);
beforeFunction.apply(this, args);
return functionToWrap.apply(this, args);
};
};
function highlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(errorClass).removeClass(validClass);
}
function unhighlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(validClass).removeClass(errorClass);
}
поэтому, когда мы объединяем все вышеперечисленные функции, это должно выглядеть примерно так:
рабочая демо в стеке фрагментов и jsFiddle
$(function () {
var valSettings = $("form").data("validator").settings
valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator)
valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator)
});
function wrap(functionToWrap, beforeFunction) {
return function () {
var args = Array.prototype.slice.call(arguments);
beforeFunction.apply(this, args);
return functionToWrap.apply(this, args);
};
};
function highlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(errorClass).removeClass(validClass);
}
function unhighlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(validClass).removeClass(errorClass);
}
input.input-validation-error {
border: solid 1px red;
}
.input-validation-error label {
color: red;
}
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"></script>
<form action="/Person" method="post">
<div class="required">
<label for="Name">Name <em>*</em></label>
<input id="Name" name="Name" type="text" value=""
data-val="true" data-val-required="The Name field is required."/>
<span class="field-validation-valid"
data-valmsg-for="Name" data-valmsg-replace="true"></span>
</div>
<input type="submit" value="Save" />
</form>
Я могу ошибаться, но похоже, что вам нужно .родители('див.контрольная группа") Нет .родитель(), который добавляет .ошибка в неправильном div, не меняя цвета формы загрузок на красный.
это потому, что вход, который jQuery Validate пытается выделить, находится на два ниже .control-группа, для которой требуется BootStrap .ошибка, чтобы получить свой эффект.
$("#form").validate({
highlight: function(element, errorClass, validClass){
$(element).parents("div.control-group").addClass(errorClass).removeClass(validClass);
},
надеюсь, что это помогает