Начальная загрузка с плагином проверки jQuery

147

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

Изображение 114

$('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/

Теги:
twitter-bootstrap-3
jquery-validate

14 ответов

352
Лучший ответ

для полной совместимости с 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/

  • 1
    Хорошая работа, это работает для меня как шарм ...!
  • 1
    Замечательно, просто хотел упомянуть добавить $ (element) .removeClass (errorClass); отменить выделение и $ (element) .addClass (errorClass); выделить, если вы хотите, чтобы успех не использовал класс блока помощи начальной загрузки
Показать ещё 8 комментариев
81

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

Обновление 10/20/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>
  • 1
    Я подправил errorClass: "help-block error-help-block" . Я уже использовал .help-block для регулярной справочной информации, и это переписывало его сообщениями проверки формы. Добавление второго класса сделало его уникальным, и теперь он добавляет, а не перезаписывает мое «реальное» справочное сообщение.
  • 0
    Метод с подсветкой не вызывается
Показать ещё 5 комментариев
22

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

Изображение 2369

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

  • 1
    Было бы здорово иметь JSFiddle для этого
  • 2
    Добро пожаловать jsfiddle.net/dark_diesel/gzmwtvh3
Показать ещё 5 комментариев
10

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

    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');
    }
8

это необходимое вам решение, вы можете использовать метод 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');
    }
});

он работает для меня как магия. Приветствия

  • 0
    error.insertAfter('.form-group'); положить ошибки во все .form-группу. но это показало мне идею. благодарю вас
4

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

// 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.

3

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

    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);
    }

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

  • 0
    Блестяще простой ответ, спасибо - просто вставил предложение дополнительного типа в мою существующую логику errorPlacement
2

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

Во-первых, чтобы правильно разместить значки, вам нужно добавить стиль, который соответствует тому, что было в bootstrap 3 и больше не в бутстрапе 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;
}

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

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

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

errorElement: 'small',
errorClass: 'form-text invalid-feedback',
1

Я знаю, что этот вопрос относится к 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
  • Лучшее расположение радиостанций и флажков с позиционированием ошибок
1

добавьте исправление в строку https://stackoverflow.com/questions/18754020/bootstrap-with-jquery-validation-plugin

$.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);
        }
    }
});
  • 0
    Это просто, очень полезно. Спасибо.
1

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

 $("#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();
                }
            });
  • 0
    Только на английском
0

для начальной загрузки 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);
        }
    }
});

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

0

Ответ 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>');
        }
    }
});
-2

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

<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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню