【问题标题】:JQuery Validate multiple fields with one errorJQuery 验证多个字段,但出现一个错误
【发布时间】:2009-08-17 16:44:09
【问题描述】:

我将如何使用 JQuery Validate 插件为 3 个字段提供一条错误消息。例如 3 个 dob 字段。默认情况下,如果所有 3 个字段都留空,我将收到 3 条错误消息。我只想要一个与 3 个字段相关联的错误。如果有任何空白,则会出现错误。

【问题讨论】:

    标签: jquery jquery-validate


    【解决方案1】:

    类似于克里斯的

    $("form").validate({
        rules: {
            DayOfBirth: { required: true },
            MonthOfBirth: { required: true },
            YearOfBirth: { required: true }
        },
        groups: {
            DateofBirth: "DayOfBirth MonthOfBirth YearOfBirth"
        },
       errorPlacement: function(error, element) {
           if (element.attr("name") == "DayOfBirth" || element.attr("name") == "MonthOfBirth" || element.attr("name") == "YearOfBirth") 
            error.insertAfter("#YearOfBirth");
           else 
            error.insertAfter(element);
       }
    });
    

    【讨论】:

    【解决方案2】:

    您可以使用组选项将输入组合在一起。如果每个输入都有错误消息,则只会显示一个。

    您可能希望覆盖与每个字段关联的消息,这样它们会更有意义。例如,默认情况下,您可能会收到“此字段为必填项”之类的错误消息。好吧,当有三个输入时,这对用户没有多大好处。您可能想要覆盖消息以显示“需要本地号码”。对于这个例子,我只是用“请输入一个有效的电话号码”覆盖了所有的错误消息。

    <input type="text" name="countryCode" />
    <input type="text" name="areaCode" />
    <input type="text" name="localNumber" />
    
    groups: {
      phoneNumber: "countryCode areaCode localNumber"
    },
    rules: {
      'countryCode': {
        required: true,
        minlength:3,
        maxlength:3,
        number:true
      },
      'contactInformation[areaCode]': {
        required: true,
        minlength:3,
        maxlength:3,
        number:true
      },
      'contactInformation[localNumber]': {
        required: true,
        minlength:4,
        maxlength:4,
        number:true
      },
    },
    messages: {
      "countryCode": {
        required: "Please enter a valid Phone Number",
        minlength: "Please enter a valid Phone Number",
        maxlength: "Please enter a valid Phone Number",
        number: "Please enter a valid Phone Number"
      },
      "areaCode": {
        required: "Please enter a valid Phone Number",
        minlength: "Please enter a valid Phone Number",
        maxlength: "Please enter a valid Phone Number",
        number: "Please enter a valid Phone Number"
      },
      "localNumber": {
        required: "Please enter a valid Phone Number",
        minlength: "Please enter a valid Phone Number",
        maxlength: "Please enter a valid Phone Number",
        number: "Please enter a valid Phone Number"
      }
    },
    

    【讨论】:

      【解决方案3】:

      这是 HTML 部分:

      <div>
          <p class="myLabel left">Date of birth:</p>
          <p class="mandatory left">*</p>
          <div class="left">
              <p><input type="text" name="dobDay" class="required" /></p>
              <p><i>dd</i></p>
          </div>
          <div class="left">
              <p><input type="text" name="dobMonth" class="required" /></p>
              <p><i>mm</i></p>
          </div>
          <div class="left">
              <p><input type="text" name="dobYear" class="required" /></p>
              <p><i>yyyy</i></p>
          </div>
          <div class="clear"></div>
          <div class="myError">
              <label for="dateOfBirth" class="error">Please enter a valid date.</label>
          </div>
      </div>
      

      这是我使用的脚本:

      $(document).ready(function() {
      
      $("#myForm").validate({
          groups: {
            dateOfBirth: "dobDay dobMonth dobYear"
          },
          rules: {
            'dobDay': {
              required: true,
              minlength:1,
              maxlength:2,
              range: [1, 31],
              number:true
            },
            'dobMonth': {
              required: true,
              minlength:1,
              maxlength:2,
              range: [1, 12],
              number:true
            },
            'dobYear': {
              required: true,
              minlength:4,
              maxlength:4,
              number:true
            },
          },
      });
      });
      

      所有 HTML 部分都可以根据您的需要进行自定义。我使用了这些复杂的布局,因为我需要将此字段添加到已经存在的表单中。但这是一个有效的例子! 希望它可以帮助任何人!

      【讨论】:

        【解决方案4】:

        我想我应该分享这个。对我有用的完整代码。

        HTML

        <div class="clearfix bl">
            <label>Fecha de nacimiento</label>
            <select name="fechanacimdia" id="fechanacimdia"></select>
            <select name="fechanacimmes" id="fechanacimmes"></select>
            <select name="fechanacimano" id="fechanacimano"></select>
        </div>
        

        JS

        //hay que poblar selects de fecha
        dia = $('#fechanacimdia');
        mes = $('#fechanacimmes');
        ano = $('#fechanacimano');
        dia.append('<option>Día</option>');
        for(i=1;i<=31;i++) {
            dia.append('<option value="'+i+'">'+i+'</option>');
        }
        meses = ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]
        mes.append('<option>Mes</option>');
        for(i=1;i<=12;i++) {
            mes.append('<option value="'+i+'">'+meses[i-1]+'</option>');
        }
        d = new Date();
        year = d.getFullYear();
        maxage = 100;
        minage = 16;
        ano.append('<option>Año</option>');
        for(i=year-minage;i>=year-maxage;i--) {
            ano.append('<option value="'+i+'">'+i+'</option>');
        }
        
        
        //--------- validate ------------------------
        
        $('#formulario').validate({
            rules: {
                fechanacimdia: { required: true },
                fechanacimmes: { required: true },
                fechanacimano: { required: true, validdate: true }
            },
            groups: {
                fechanacim: "fechanacimdia fechanacimmes fechanacimano"
            },
            messages: {
                fechanacimdia: "Fecha de nacimiento no es válida.",
                fechanacimmes: "Fecha de nacimiento no es válida.",
                fechanacimano: "Fecha de nacimiento no es válida."
            },
        });
        //funcion auxiliar para validar fecha de nacimiento correcta
        jQuery.validator.addMethod("validdate", function(value, element) {
            var month = +$('#fechanacimmes').val() - 1; // Convert to numbers with "+" prefix
            var day = +$('#fechanacimdia').val();
            var year = +$('#fechanacimano').val();
            var date = new Date(year, month, day); // Use the proper constructor
            return date.getFullYear() == year && date.getMonth() == month && date.getDate() == day;
        });
        

        【讨论】:

        • 我使用了这段代码并且可以很好地检查日期..但是当我选择日期时,它不会检查是否选择了月份或年份,它只是通过了验证。知道这可能是什么吗?
        【解决方案5】:

        我的看法是更改 jQuery validator 以验证带有 validateable 属性的任何内容以及标准输入。可以获取1.9.0修改版插件here

        基本上,您导入新的 jquery 验证器并执行以下操作:

        <script>
        $.validator.addMethod(
            "groupnotnull",
            function(value, element) {
                return $("input[type='text']:filled",element).length!=0;
            },
            function(regexp, element) {
              return "At least one input must be specified";
            }
        );
        </script>
        
        <div validateable="true" name="groupValidated" groupnotnull="true">
            <input type="text" name="foo"/>
            <input type="text" name="blah"/>
        </div>
        

        jQuery validator 所需的修改是使其使用.attr('name') 而不是.name,因为.name 仅适用于表单字段。并修改 key up 处理程序等以绑定到 validateable 元素的子元素。

        这比组更具动态性,因为它允许字段相互验证,而不仅仅是单个实体。

        【讨论】:

        • 修改jquery验证器核心总是一个坏主意,相反你应该创建一个新插件,它允许你独立更新产品
        【解决方案6】:

        如果任何必填字段为空,此代码将显示一个常见错误。

        <html>
        <head>
          <script src="http://code.jquery.com/jquery-latest.js"></script>  
          <script>
        $(document).ready(function(){
          $("#myform").validate({
            invalidHandler: function(form, validator) {
              var errors = validator.numberOfInvalids();
              if (errors) {
                var message ='You missed ' + errors + ' fields.';
                $("#messageBox").html(message);
                $("#messageBox").show();
              } else {
                $("#messageBox").hide();
              }
            },
            showErrors: function(errorMap, errorList) {
        
            },
            submitHandler: function() { alert("Submit!") }
         })
        });  
        </script>
        
        </head>
        <body>
          <script type="text/javascript" src="http://dev.jquery.com/view/trunk/plugins/validate/jquery.validate.js"></script>
        <div id="messageBox"></div> 
        <ul id="errorlist"></ul>
         <form id="myform" action="/loginurl" method="post"> 
           <label>DOB1</label> 
           <input name="dob1" class="required" /> 
           <label>DOB2</label> 
           <input name="dob2" class="required" /> 
           <label>DOB3</label> 
           <input name="dob3" class="required" />
           <br/>
           <input type="submit" value="Submit"/>
         </form>
        </body>
        </html>
        

        【讨论】:

        • 我认为,即使有格式错误或其他问题,也会弹出此错误
        【解决方案7】:

        几个选项:查看errorContainer。您可以将所有错误转到完全独立的&lt;div&gt;。或者您可以查看invalid 块,然后使用errorMessage.show() 命令。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-28
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          相关资源
          最近更新 更多