Как отображать контейнер ошибок проверки jQuery только при отправке

Я пытаюсь сделать Validation plugin. Он отлично работает для отдельных полей, но когда я пытаюсь включить демонстрационный код для контейнера ошибок, который содержит все ошибки, у меня есть проблема. Проблема заключается в том, что он показывает контейнер со всеми ошибками, когда я во всех полях, но я хотел бы отображать контейнер ошибок только тогда, когда пользователь нажимает кнопку отправки (но все же отображает встроенные ошибки рядом с элементом управления при потере фокуса).

Проблема заключается в сообщении в контейнере. Когда я снял код, как указано в ответе ниже для контейнера, вывод контейнера отображает количество ошибок в открытом тексте.

Каков трюк, чтобы получить список подробных сообщений об ошибках? Я хотел бы отобразить "ОШИБКУ" рядом с элементом управления по ошибке, когда пользователь нажимает кнопку вкладки и имеет сводку всего в конце, когда он нажимает submit. Возможно ли это?

Код со всеми вводами здесь:

    $().ready(function() {
        var container = $('div.containererreurtotal');

        // validate signup form on keyup and submit
        $("#frmEnregistrer").bind("invalid-form.validate", function(e, validator) {
          var err = validator.numberOfInvalids();
          if (err) {
            container.html("THERE ARE "+ err + " ERRORS IN THE FORM")
            container.show();
          } else {
            container.hide();
          }
        }).validate({
                    rules: {
                            nickname_in: {
                                    required: true,
                                    minLength: 4
                            },
                            prenom_in: {
                                    required: true,
                                    minLength: 4
                            },
                            nom_in: {
                                    required: true,
                                    minLength: 4
                            },
                            password_in: {
                                    required: true,
                                    minLength: 4
                            },
                            courriel_in: {
                                    required: true,
                                    email: true
                            },
                            userdigit: {
                                    required: true
                            }
                    },
                    messages: {
                            nickname_in: "ERROR",
                            prenom_in: "ERROR",
                            nom_in: "ERROR",
                            password_in: "ERROR",
                            courriel_in: "ERROR",
                            userdigit: "ERROR"
                    }

                    ,errorPlacement: function(error, element){
                            container.append(error.clone());
                            error.insertAfter(element);
                    }

            });
    });

Ответы

Ответ 1

Вы найдете документацию для мета-опции в http://docs.jquery.com/Plugins/Validation/validate#toptions

Если вы хотите отображать ошибки рядом с входами И в отдельном контейнере ошибок, вам необходимо переопределить обратный вызов errorPlacement.

В вашем примере:

...
                    courriel_in: "ERROR",
                    userdigit: "ERROR"
            }
            ,errorContainer: container

            ,errorPlacement: function(error, element){
                var errorClone = error.clone();
                container.append(errorClone);
                error.insertAfter(element)              
            }

            // We don't need this options
            //,errorLabelContainer: $("ol", container)
            //,wrapper: 'li'
            //,meta: "validate"
    });
 ...

Параметр error - это объект jQuery, содержащий тег <label>. Параметр element - это вход, который не прошел проверку.

Обновить комментарии

В приведенном выше коде контейнер ошибок не будет очищать ошибки, поскольку он содержит клонированную копию. Это легко решить, если jQuery дает событие "скрыть", но его не существует. Позвольте добавить событие hide!

  • Сначала нам нужен плагин AOP
  • Мы добавляем рекомендации для метода hide:

                jQuery.aop.before({target: jQuery.fn, method: "hide"},
                    function(){
                        this.trigger("hide");
                    });
    
  • Мы связываем событие hide, чтобы скрыть клонированную ошибку:

            ...
            ,errorPlacement: function(error, element){
                var errorClone = error.clone();
                container.append(errorClone);
                error.insertAfter(element).bind("hide", function(){
                    errorClone.hide();
                });
            }
            ...
    

Попробуйте

Ответ 2

Сначала ваш контейнер должен использовать идентификатор вместо класса. (Я собираюсь предположить, что идентификатор "containererreurtotal" )

Затем попробуйте это.

    $().ready(function() {

        $('div#containererreurtotal').hide();

        // validate signup form on keyup and submit
        $("#frmEnregistrer").validate({
            errorLabelContainer: "#containererreurtotal",
            wrapper: "p",
            errorClass: "error",
            rules: {
                nickname_in: { required: true, minLength: 4 },
                prenom_in: { required: true, minLength: 4 },
                nom_in: { required: true, minLength: 4 },
                password_in: { required: true, minLength: 4 },
                courriel_in: { required: true,  email: true },
                userdigit: { required: true }
            },
            messages: { 
                nickname_in: { required: "Nickname required!", minLength: "Nickname too short!" },
                prenom_in: { required: "Prenom required!", minLength: "Prenom too short!" },
                nom_in: { required: "Nom required!", minLength: "Nom too short!" },
                password_in: { required: "Password required!", minLength: "Password too short!" },
                courriel_in: { required: "Courriel required!", email: "Courriel must be an Email" },
                userdigit: { required: "UserDigit required!" }
            },
            invalidHandler: function(form, validator) {
                $("#containererreurtotal").show();
            },
            unhighlight: function(element, errorClass) {
                if (this.numberOfInvalids() == 0) {
                    $("#containererreurtotal").hide();
                }
                $(element).removeClass(errorClass);
            }    

        });
    });

Я предполагаю, что вы хотите <p> тег вокруг каждой из отдельных ошибок. Обычно я использую <ul> контейнер для фактического контейнера (вместо используемого вами div, называемого контейнерным перевозчиком) и <li> для каждой ошибки (этот элемент указан в строке "обертка" )

Если вы укажете #containererreurtotal как отображение: none; в вашем CSS, тогда вам не нужна первая строка в готовой функции ($ ('div # containererreurtotal'). hide();)

Ответ 3

Я бы удалил errorContainer, а затем перехватил проверку на postback и там добавили ошибку контейнера вручную следующим образом:

$("#frmEnregistrer").bind("invalid-form.validate", function(e, validator) {
  var err = validator.numberOfInvalids();
  if (err) {
    container.html("THERE ARE "+ err + " ERRORS IN THE FORM")
    container.show();
  } else {
    container.hide();
  }
}).validate({ ... })

Ответ 4

У меня немного другое решение:

jQuery(document).ready(function() {
  var submitted = false;
  var validator = jQuery("#emailForm").validate({ 
      showErrors: function(errorMap, errorList) {
          if (submitted) {
              var summary = "";
              jQuery.each(errorList, function() {
              summary += "<li><label for='"+ this.element.name;
              summery += "' class='formError'>" + this.message + "</label></li>"; });
              jQuery("#errorMessageHeader").show();
              jQuery("#errorMessageHeader").children().after().html(summary);
              submitted = false;
          }
          this.defaultShowErrors();
      },          
      invalidHandler: function(form, validator) { submitted = true; },
      onfocusout: function(element) { this.element(element); },
      errorClass: "formError",
      rules: { 
          //some validation rules 
      },
      messages: { 
          //error messages to be displayed
      }           
  }); 
}); 

Ответ 5

Я решил эту проблему с помощью следующего короткого кода:

errorElement: "td",
errorPlacement: function (error, element) {
     error.insertAfter(element.parent());
} 

Моя структура следующая:

<table>
   <tr>
      <td>Name:</td>
      <td><input type="text" name="name"></td>
   </tr>
</table>

Итак, мои ошибки теперь отображаются непосредственно в <td> за моей <input>

Ответ 6

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

<div id="container" style="display:none;"></div>

Затем вы можете подключить событие onsubmit к форме, которая сделает контейнер видимым, как только будет сделана попытка отправить форму:

jQuery('#formId').onsubmit(function() {
    // This will be called before the form is submitted
    jQuery('#container').show();
});

Надеемся, что сочетание этого с вашим существующим кодом должно сделать трюк.