Проверка jQuery - добавление класса ошибок в родительский элемент Div - PullRequest
10 голосов
/ 30 октября 2011

Я использую плагин jQuery Validate и никогда не могу найти хороший способ отображения ошибок для флажков. Я хотел бы выделить все метки флажков красным, если ни один не выбран, и решил сделать это, добавив класс ошибок в div, который содержит флажки и метки флажков. Тем не менее, это не похоже на добавление класса. Я не правильно выбираю div?

HTML:

<div class="left-aligned indent">

    <label id="id_label" for="id" class="label">Items:</label>

    <div class="select-group">

        <input type="checkbox" name="items" value="1" id="item_1" />
        <label class="checkbox">Item #1</label><br />

        <input type="checkbox" name="items" value="1" id="item_2" />
        <label class="checkbox">Item #2</label><br />

        <input type="checkbox" name="items" value="1" id="item_3" />
        <label class="checkbox">Item #3</label><br />

    </div>

</div>

Javascript:

$().ready(function() {

    $('#addForm').validate({
        rules: { 
            "items": { 
                required: true, 
                minlength: 1 
            } 
        }, 
        errorPlacement: function(error, element) {
            if (element.is(':checkbox')) {
                $(this).prev("div").addClass('checkbox-error');
            }
            else {
                 return true;
            }
         }
    }); 


});

CSS:

.error {
    background-color: #FF898D;
    border: 1px solid #000;
}

.checkbox-error {
    color: #FF898D;
}

Ответы [ 3 ]

39 голосов
/ 20 июня 2013

Это должно работать:

    $('#myform').validate({
    highlight: function(element) {
        $(element).parent().addClass("field-error");
    },
    unhighlight: function(element) {
        $(element).parent().removeClass("field-error");
    }
    });

Ознакомьтесь с документацией для получения дополнительных опций:

8 голосов
/ 30 октября 2011
$(element).parent('div').addClass('checkbox-error');
5 голосов
/ 21 ноября 2017

Из моего ответа на добавьте класс в родительский div, если ошибка проверки происходит с использованием проверки jquery , потому что я считаю, что это добавляет ценность к существующим ответам на этот вопрос ...

Настройки валидатора доступа

Первым делом нужно изменить объект settings в валидаторе вашей формы. Вы можете сделать это любым из следующих способов:

  1. Перед загрузкой формы для всех форм вызовите jQuery.validator.setDefaults()
  2. При инициализации формы путем ввода параметров на .validate([options])
  3. После инициализации путем обнаружения объекта валидатора в форме с помощью $("form").data("validator").settings

Поскольку вы используете MVC, вариант № 2 исключен, поскольку unobtrusive-validation автоматически инициализирует форму. Итак, давайте воспользуемся опцией 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. Полностью замените эти функции и напишите их самостоятельно
  2. Оберните эти функции и вызывайте их как обычно, но добавьте свой собственный код до или после.

Вариант 1 - Заменить оптом

Этот маршрут довольно прост. Просто напишите там, что вы хотите. Может быть, семена из исходного кода, возможно, делать свое дело.

var valSettings = $("form").data("validator").settings
valSettings.highlight = function(element, errorClass, validClass) { ... }
valSettings.unhighlight = function(element, errorClass, validClass) { ... }

Вариант 2 - Функции обтекания

Это менее навязчиво, поэтому, вероятно, предпочтительнее в большинстве случаев.

Поскольку в конечном итоге вы замените значение valSettings.highlight, вам потребуется доступ к чистой исходной версии исходной функции. Вы можете сохранить свой собственный или получить один из глобальных значений по умолчанию

// original highlight function
var highlightOriginal = $("form").data("validator").settings.highlight;
var highlightDefaults = $.validator.defaults.highlight

С точки зрения упаковки функций JavaScript, есть пара примеров здесь , здесь и здесь ). Вот проанализированный пример одного из них, который поможет связать контекст this между вызовами функций, сохранить арность передаваемых аргументов и сохранить возвращаемое значение:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...