Bootstrap с подключаемым модулем проверки jQuery

Я пытаюсь добавить проверку в свою форму с помощью подключаемого модуля проверки jQuery, но у меня возникает проблема, когда подключаемый модуль помещает сообщения об ошибках, когда я использую группы ввода.

проблема

$('form').validate({
    rules: {
        firstname: {
            minlength: 3,
            maxlength: 15,
            required: true
        },
        lastname: {
            minlength: 3,
            maxlength: 15,
            required: true
        }
    },
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    }
});

Мой код: http://jsfiddle.net/hTPY7/4/


person Miguel Borges    schedule 12.09.2013    source источник
comment
Унаследовал приложение с Bootstrap 3, посмеялся, что нашел его и добавил в закладки много лет назад, когда в последний раз унаследовал приложение с Bootstrap 3.   -  person Adrian J. Moreno    schedule 13.05.2020


Ответы (15)


для полной совместимости с twitter bootstrap 3 мне нужно переопределить некоторые методы плагинов:

// override jquery validate plugin defaults
$.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    },
    errorElement: 'span',
    errorClass: 'help-block',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else {
            error.insertAfter(element);
        }
    }
});

См. Пример: http://jsfiddle.net/mapb_1990/hTPY7/7/

person Miguel Borges    schedule 12.09.2013
comment
Работает отлично, просто хотел упомянуть о добавлении $ (element) .removeClass (errorClass); убрать выделение и $ (element) .addClass (errorClass); чтобы выделить, если вы хотите успеха, чтобы не использовать класс блока справки начальной загрузки - person Jay Rizzi; 22.11.2013
comment
Это работает хорошо, за исключением одного: тестирование на соответствие jQuery Validate 1.11.1 и вызов resetForm() в валидаторе формы не вызовет unhighlight для недопустимых элементов, что делает необходимым удаление класса has-error вручную при сбросе формы. Что я делаю, так это вызываю следующую функцию вместо прямого вызова resetForm() валидатора: function resetForm(form_id) { $(form_id).find(".form-group").removeClass("has-error"); $(form_id).data('validator').resetForm(); } - person Adrian Lopez; 19.03.2014
comment
Я не знаю, почему код не работает в моей форме :( - person Alyssa Reyes; 09.04.2014
comment
Черт возьми, это работает как шарм! Большое спасибо !!! Вы сэкономили мне час или два на исследования. - person racl101; 19.09.2014
comment
Это фантастика. Спасибо! - person Bryan Slatner; 19.10.2014
comment
Если у вас есть радиокнопки, такие как предлагает Bootstrap (радиовходы, помещенные внутри тегов меток), вы захотите добавить что-то вроде этого к этому блоку if: else if (element.prop('type') === 'radio') { error.insertBefore(element.parent().parent()); } - person Elliot Cameron; 22.10.2016
comment
Идеальный код. не нужно настраивать какой-либо код! Я только что вставил этот код и работал как по волшебству! благодаря. - person ganesh; 08.01.2020

Для полной совместимости с Bootstrap 3 я добавил поддержку input-group, radio и checkbox, которые отсутствовали в других решениях.

Обновление 20.10.2017: изучены предложения других ответов и добавлена ​​дополнительная поддержка специальной разметки встроенного радио, улучшено размещение ошибок для группы радио или флажков и добавлена ​​поддержка настраиваемого класса .novalidation для предотвращения проверки элементов управления. Надеюсь, это поможет, и спасибо за предложения.

После включения плагина проверки добавьте следующий вызов:

$.validator.setDefaults({
    errorElement: "span",
    errorClass: "help-block",
    highlight: function (element, errorClass, validClass) {
        // Only validation controls
        if (!$(element).hasClass('novalidation')) {
            $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        // Only validation controls
        if (!$(element).hasClass('novalidation')) {
            $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
        }
    },
    errorPlacement: function (error, element) {
        if (element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        }
        else if (element.prop('type') === 'radio' && element.parent('.radio-inline').length) {
            error.insertAfter(element.parent().parent());
        }
        else if (element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
            error.appendTo(element.parent().parent());
        }
        else {
            error.insertAfter(element);
        }
    }
});

Это работает для всех классов форм Bootstrap 3. Если вы используете горизонтальную форму, вы должны использовать следующую разметку. Это гарантирует, что текст help-block соответствует состояниям проверки ("has-error", ...) form-group.

<div class="form-group">
    <div class="col-lg-12">
        <div class="checkbox">
            <label id="LabelConfirm" for="CheckBoxConfirm">
                <input type="checkbox" name="CheckBoxConfirm" id="CheckBoxConfirm" required="required" />
                I have read all the information 
            </label>
        </div>
    </div>
</div>
person Andreas Krohn    schedule 25.09.2013
comment
Я подправил errorClass: "help-block error-help-block". Я уже использовал .help-block для регулярной справочной информации, и это перезаписывало ее сообщениями проверки формы. Добавление второго класса сделало его уникальным, и теперь он добавляет, а не перезаписывает мое настоящее справочное сообщение. - person Scott Stafford; 28.01.2015
comment
Метод Hilight не вызван - person Vlado Pandžić; 02.05.2016
comment
Привет, Владо, не могли бы вы дать дополнительную информацию, почему это не работает для вас? - person Andreas Krohn; 03.05.2016
comment
Для группы переключателей это добавит сообщение об ошибке под первым вариантом, что выглядит странно. Вы, вероятно, захотите настроить это, чтобы по-разному обрабатывать переключатели. - person Elliot Cameron; 22.10.2016
comment
Большое спасибо, мистер @AndreasKrohn ^ _ ^ - person Jeancarlo Fontalvo; 29.12.2016
comment
Рад, что смог помочь :) @JeancarloFontalvo - person Andreas Krohn; 05.01.2017
comment
Мне пришлось добавить width: 100%; к моей метке флажка, чтобы это сработало, сообщение помещалось прямо рядом с ним - person Bruno Peres; 15.03.2017

Я использую формы, разработанные только с помощью Twitter Bootstrap 3. Я устанавливаю функции по умолчанию для валидатора и запускаю только метод проверки с правилами. Я использую значки из FontAweSome, но вы можете использовать глификоны, как в примере документа.

введите описание изображения здесь

jQuery.validator.setDefaults({
    highlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).addClass(errorClass).removeClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-success has-feedback').addClass('has-error has-feedback');
            $(element).closest('.form-group').find('i.fa').remove();
            $(element).closest('.form-group').append('<i class="fa fa-exclamation fa-lg form-control-feedback"></i>');
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).removeClass(errorClass).addClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-error has-feedback').addClass('has-success has-feedback');
            $(element).closest('.form-group').find('i.fa').remove();
            $(element).closest('.form-group').append('<i class="fa fa-check fa-lg form-control-feedback"></i>');
        }
    }
});

Сделанный. После запуска функции проверки:

$("#default-register-user").validate({
    rules: {
        'login': {
            required: true,
            minlength: 5,
            maxlength: 20
        },
        'email': {
            required: true,
            email: true,
            minlength: 5,
            maxlength: 100
        },
        'password': {
            required: true,
            minlength: 6,
            maxlength: 25
        },
        'confirmpassword': {
            required: true,
            minlength: 5,
            maxlength: 25,
            equalTo: "#password"
        }
    }
});

Пример JSFiddle

person DARK_DIESEL    schedule 18.07.2014
comment
Было бы здорово иметь для этого JSFiddle - person kofifus; 18.09.2014
comment
Не могли бы вы опубликовать HTML-код, который вы использовали для скриншота? В примере скрипки нет ни красного сообщения об ошибке, ни значков. Спасибо! - person Christopher Francisco; 02.09.2015
comment
Кристофер Франциско, я обновил пример JSFiddle и добавил отличный шрифт css. - person DARK_DIESEL; 10.09.2015
comment
Привет, отличное решение! Как бы вы отредактировали это так, чтобы только те поля, у которых есть правила, отображали сообщения об успехе или неудаче? Правильно, ваш код заставляет все поля отображать CSS, независимо от того, есть ли правила или нет - person Michael Smith; 28.09.2015
comment
Решение состоит в том, чтобы добавить: 'ignore: .ignore,: hidden' прямо над правилами. Затем просто добавьте класс игнорирования ко всем полям, которые вы не хотите проверять. - person Michael Smith; 13.10.2015
comment
Проверка электронной почты не работает должным образом. Вы можете ввести что-то вроде asga @ da - да, без окончания домена, и он будет принят. Это связано с тем, что целевой объект ввода «электронная почта» заключен в кавычки - они должны быть опущены - тогда он работает правильно. - person Hexodus; 13.02.2016

Добавив к ответу Мигеля Борхеса выше, вы можете дать пользователю эту зеленую обратную связь об успехе, добавив следующую строку в блок кода выделения / отмены выделения.

    highlight: function(element) {
        $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
    }
person Jose Apollo    schedule 20.01.2014

это решение, которое вам нужно, вы можете использовать метод errorPlacement, чтобы переопределить, где помещать сообщение об ошибке

$('form').validate({
    rules: {
        firstname: {
            minlength: 3,
            maxlength: 15,
            required: true
        },
        lastname: {
            minlength: 3,
            maxlength: 15,
            required: true
        }
    },
    errorPlacement: function(error, element) {
        error.insertAfter('.form-group'); //So i putted it after the .form-group so it will not include to your append/prepend group.
    }, 
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    }
});

для меня это работает как по волшебству. Ваше здоровье

person Drixson Oseña    schedule 12.09.2013
comment
error.insertAfter('.form-group'); поместил ошибки во все .form-group. но это показало мне идею. Спасибо - person Miguel Borges; 12.09.2013

для начальной загрузки 4 эта работа со мной хороша

    $.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').find(".form-control:first").addClass('is-invalid');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').find(".form-control:first").removeClass('is-invalid');
        $(element).closest('.form-group').find(".form-control:first").addClass('is-valid');

    },
    errorElement: 'span',
    errorClass: 'invalid-feedback',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else {
            error.insertAfter(element);
        }
    }
});

надеюсь, это поможет!

person Jehad Ahmad Jaghoub    schedule 06.02.2019
comment
Это очень хорошо работает прямо из коробки! Я добавил только validClass: 'valid-feedback' - person Simon Zyx; 21.10.2019
comment
Спасибо, у меня это сработало для Bootstrap 4 с validClass: 'valid-feedback'. - person Zaki Mohammed; 03.02.2020

Вот что я использую при добавлении валидации в форму:

// Adding validation to form.
        $(form).validate({
            rules: {
                title: {
                    required: true,
                    minlength: 3,
                },
                server: {
                    ipAddress: true,
                    required: true
                }   
            },
            highlight: function(element) {
                $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
            },
            success: function(element) {
                $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
            },
            errorClass: 'help-block'
        });

Это сработало для меня для стиля Bootstrap 3 при использовании библиотеки проверки jquery.

person Edwin Perez    schedule 31.10.2013

Я использовал это для радио:

    if (element.prop("type") === "checkbox" || element.prop("type") === "radio") {
        error.appendTo(element.parent().parent());
    }
    else if (element.parent(".input-group").length) {
        error.insertAfter(element.parent());
    }
    else {
        error.insertAfter(element);
    }

таким образом ошибка отображается под последней опцией радио.

person Marcel Overdijk    schedule 31.05.2014
comment
Блестяще простой ответ, спасибо - просто вставил дополнительное предложение типа в мою существующую логику errorPlacement - person theotherdy; 13.01.2015

Я знаю, что этот вопрос относится к Bootstrap 3, но поскольку некоторые вопросы, связанные с Bootstrap 4, перенаправляются на этот как дубликаты, вот фрагмент, совместимый с Bootstrap 4:

$.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-danger');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-danger');
    },
    errorElement: 'small',
    errorClass: 'form-control-feedback d-block',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else if(element.prop('type') === 'checkbox') {
            error.appendTo(element.parent().parent().parent());
        } else if(element.prop('type') === 'radio') {
            error.appendTo(element.parent().parent().parent());
        } else {
            error.insertAfter(element);
        }
    },
});

Вот несколько отличий:

  • Использование класса has-danger вместо has-error
  • Лучшее определение местоположения ошибок и флажки
person martpie    schedule 16.01.2017
comment
В Bootstrap 4 больше нет классов .has-*. getbootstrap.com/docs/4.3/migration/#forms-1 - person Fred; 08.08.2019

Для бета-версии bootstrap 4 произошли некоторые большие изменения между альфа- и бета-версиями bootstrap (а также bootstrap 3), особенно. Что касается проверки формы.

Во-первых, чтобы правильно разместить значки, вам нужно добавить стиль, который соответствует тому, что было в bootstrap 3, а не в бета-версии bootstrap 4 ... вот что я использую

.fa.valid-feedback,
.fa.invalid-feedback {
    position: absolute;
    right: 25px;
    margin-top: -50px;
    z-index: 2;
    display: block;
    pointer-events: none;
}

.fa.valid-feedback {
    margin-top: -28px;
}

Классы также изменились, поскольку бета-версия использует «состояние» элемента управления, а не классы, которые ваш опубликованный код не отражает, поэтому указанный выше код может не работать. В любом случае вам нужно будет добавить в форму класс 'was-validated' либо в случае успеха, либо в обратных вызовах выделения / отмены выделения.

$(element).closest('form').addClass('was-validated');

Я бы также рекомендовал использовать новый элемент и классы для текста справки по управлению формой.

errorElement: 'small',
errorClass: 'form-text invalid-feedback',
person user2030404    schedule 20.11.2017

Это составляет поля

 $("#form_questionario").validate({
                debug: false,
                errorElement: "span",
                errorClass: "help-block",
                highlight: function (element, errorClass, validClass) {
                    $(element).closest('.form-group').addClass('has-error');
                },
                unhighlight: function (element, errorClass, validClass) {
                    $(element).closest('.form-group').removeClass('has-error');
                },
                errorPlacement: function (error, element) {
                    if (element.parent('.input-group').length || element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
                        error.insertBefore(element.parent());
                    } else {
                        error.insertAfter(element);
                    }
                },
                // Specify the validation rules
                rules: {
                        'campo1[]': 'required',
                        'campo2[]': 'required',
                        'campo3[]': 'required',
                        'campo4[]': 'required',
                        'campo5[]': 'required'
                        },

                submitHandler: function (form) {
                    form.submit();
                }
            });
person gilcierweb    schedule 09.02.2015

добавить исправление встроенного радио в этот https://stackoverflow.com/a/18754780/966181

$.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    },
    errorElement: 'span',
    errorClass: 'help-block',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else if (element.parent('.radio-inline').length) {
            error.insertAfter(element.parent().parent());
        } else {
            error.insertAfter(element);
        }
    }
});
person bl4ckb1rd    schedule 15.07.2015
comment
Это просто, очень помогает. Спасибо. - person Chofoteddy; 02.12.2015

Ответ DARK_DIESEL отлично поработал для меня; вот код для тех, кому нужен эквивалент с использованием глификонов:

jQuery.validator.setDefaults({
    highlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).addClass(errorClass).removeClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-success has-feedback').addClass('has-error has-feedback');
            $(element).closest('.form-group').find('span.glyphicon').remove();
            $(element).closest('.form-group').append('<span class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>');
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).removeClass(errorClass).addClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-error has-feedback').addClass('has-success has-feedback');
            $(element).closest('.form-group').find('span.glyphicon').remove();
            $(element).closest('.form-group').append('<span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span>');
        }
    }
});
person jamshehan    schedule 07.01.2016

Попробуйте использовать этот образец кода. Использование подключаемого модуля проверки JQuery и дополнительных методов. Это рабочий код моего проекта. Надеюсь, это поможет тебе

//jquery validation booking page
	
	// Wait for the DOM to be ready
$(function() {
  // Initialize form validation on the registration form.
  // It has the name attribute "registration"
  $("form[name='book']").validate({
	  //on key up validation
	  onkeyup: function(element) {
      $(element).valid(); 
    },  
    // Specify validation rules
    rules: {
      // The key name on the left side is the name attribute
      // of an input field. Validation rules are defined
      // on the right side
      fname: {
        required: true,
        lettersonly: true
        },
      lname:{
        required: true,
        lettersonly: true
        },
      email: {
        required: true,
        // Specify that email should be validated
        // by the built-in "email" rule
        email: true
      },
      password: {
        required: true,
        minlength: 5
      }
    },
    // Specify validation error messages
    messages: {
      fname: {
      required:"Please enter your firstname",
      lettersonly:"Letters allowed only"
      },
      lname: {
      required:"Please enter your lastname",
      lettersonly:"Letters allowed only"
      },
      email: "Please enter a valid email address"
    },
    // Make sure the form is submitted to the destination defined
    // in the "action" attribute of the form when valid
    submitHandler: function(form) {
      form.submit();
    }
  });
});
.error {
  color: red;
  margin-left: 5px;
  font-size:15px;
}
<script src="design/bootstrap-3.3.7-dist/js/jquery.validate.js"></script>
<script src="design/bootstrap-3.3.7-dist/js/additional-methods.js"></script>

<form name="book" id="book" action="" method="post">

    <div class="row form-group">
        <div class="col-md-6 ">
            <label class="" for="fname">First Name</label>
            <input type="text" name="fname" id="fname" class="form-control" placeholder="First Name">
        </div>
        <div class="col-md-6">
            <label class="" for="lname">Last Name</label>
            <input type="text" name="lname" id="lname" class="form-control" placeholder="Last Name">
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-6 ">
            <label class="" for="date">Date</label>
            <input type="text" id="date" class="form-control datepicker px-2" placeholder="Date of visit">
        </div>
        <div class="col-md-6">
            <label class="" for="email">Email</label>
            <input type="email" name="email" id="email" class="form-control" placeholder="Email">
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-12">
            <label class="" for="treatment">Service You Want</label>
            <select name="treatment" id="treatment" class="form-control">
                <option value="">Hair Cut</option>
                <option value="">Hair Coloring</option>
                <option value="">Perms and Curls</option>
                <option value="">Hair Conditioning</option>
                <option value="">Manicure</option>
                <option value="">Pedicure</option>
                <option value="">Nails Extension</option>
                <option value="">Nail Design</option>
                <option value="">Waxing Eyebrows</option>
                <option value="">Waxing Hands/Legs</option>
                <option value="">Full Face Waxing</option>
                <option value="">Full Body/Body Parts Wax</option>
            </select>
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-12">
            <label class="" for="note">Notes</label>
            <textarea name="note" id="note" cols="30" rows="5" class="form-control" placeholder="Write your notes or questions here..."></textarea>
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-12">
            <center><input type="submit" value="Book Now" class="btn btn-primary btn-lg"></center>
        </div>
    </div>

</form>

person Abhishek Yadav    schedule 24.06.2019

Другой вариант - заранее разместить контейнер с ошибкой вне группы форм. Затем валидатор будет использовать его при необходимости.

<div class="form-group">
  <label class="control-label" for="new-task-due-date">When is the task due?</label>
  <div class="input-group date datepicker">
    <input type="text" id="new-task-due-date" class="required form-control date" name="dueDate" />
    <span class="input-group-addon">
      <span class="glyphicon glyphicon-calendar"></span>
    </span>                          
  </div>
  <label for="new-task-due-date" class="has-error control-label" style="display: none;"></label>
</div>
person Neve12ende12    schedule 08.09.2014