【问题标题】:Validating Multiple Textbox Date with jQuery Validate使用 jQuery Validate 验证多个文本框日期
【发布时间】:2009-11-12 18:53:20
【问题描述】:

我正在尝试编写自定义方法来验证日期。然而,日期存在于三个文本框中。此外,这个日期可能有多个实例。

    <div class="customDate"> 
        <input class="month" id="dob_Month" maxlength="2" name="dob.Month" type="text"  /> 
        /
        <input class="day" id="dob_Day" maxlength="2" name="dob.Day" type="text" /> 
        /
        <input class="year" id="dob_Year" maxlength="4" name="dob.Year" type="text"  /> 
    </div> 

在提交时,我想验证任何包含 customDate 类的 div。 IE。 确保所有框都已填满,确保范围正确,等等。我正在使用以下代码:

$.validator.addMethod("customDate", function(element) { return false;}, "error message");

但是验证功能没有触发。我错过了什么?另外,有没有更好的方法来做到这一点。

注意:我已经删除了实际验证逻辑的功能。我只需要知道如何触发验证方法。

【问题讨论】:

    标签: javascript jquery validation


    【解决方案1】:

    按照以下指南,我设法在不使用隐藏字段的情况下创建了多个字段验证 http://docs.jquery.com/Plugins/Validation/multiplefields 并相应修改

    • 虽然可能有点矫枉过正:)

    html代码

    <div class="whatever">
    
        <!-- dob html -->
        <div id="dobdate">
        <select name="dobday" class="dateRequired" id="dobday">
                 <option value="">Day</option>
             <option value="1">1</option>
        </select>
    
        <select name="dobmonth" class="dateRequired" id="dobmonth">
             <option value="">Month</option>
             <option value="January">January</option>
        </select>
    
        <select name="dobyear" class="dateRequired" id="dobyear">
                 <option value="">Year</option>
             <option value="2010">2010</option>
        </select>
        <div class="errorContainer">&nbsp;</div>
        </div>
    
        <br />
    
        <div id="joinedate">
        <!-- date joined html -->
        <select name="joinedday" class="dateRequired" id="joinedday">
               <option value="">Day</option>
               <option value="1">1</option>
        </select>
    
        <select name="joinedmonth" class="dateRequired" id="joinedmonth">
             <option value="">Month</option>
             <option value="January">January</option>
        </select>
    
        <select name="joinedyear" class="dateRequired" id="joinedyear">
                <option value="">Year</option>
            <option value="2010">2010</option>
        </select>
        <div class="errorContainer">&nbsp;</div>
        </div>
            <br />
        <input name="submit" type="submit" value="Submit" class="submit" title="Submit"/>
    </div>
    

    jquery 代码

     // 1. add a custom validation method
    
     $.validator.addMethod("CheckDates", function(i,element) 
     {
          // function with date logic to return whether this is actually a valid date - you'll need to create this to return a true/false result
          return IsValidDate(element);
    
     }, "Please enter a correct date");
    
     // 2. add a class rule to assign the validation method to the relevent fields - this sets the fields with class name of "dateRequired" to be required and use the method youve set up above
    
     $.validator.addClassRules({
         dateRequired: { required:true, CheckDates:true}
     });
    
    // 3. add a validation group (consists of the fields you want to validate)
    
    $("#myForm").validate(
    {
        submitHandler: function() 
        {
             alert("submitted!");
        },
        groups: 
        {
                    dob: "dobyear dobmonth dobday", joined : "joinedyear joinedmonth joinedday"
        },
        messages: { dob : " ", joined : " " // sets the invidual errors to nothing so that only one message is displayed for each drop down group 
        },
        errorPlacement: function(error, element) 
        {
           element.parent().children(".errorContainer").append(error);
        }
    });
    

    JavaScript 代码

    function IsValidDate(_element)
    {
        // just a hack function to take an element, get the drop down fields within it with a particular class name ending with day /month/ year and perform a basic date time test
        var $dateFields =  $("#" + _element.id).parent();
    
        day = $dateFields.children(".dateRequired:[name$='day']");
        month = $dateFields.children(".dateRequired:[name$='month']");
        year = $dateFields.children(".dateRequired:[name$='year']");
    
        var $newDate = month.val() + " " + day.val() + " " + year.val();
    
        var scratch = new Date($newDate );
    
        if (scratch.toString() == "NaN" || scratch.toString() == "Invalid Date") 
        {
            return false;
        } else {
            return true;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我会尝试在验证之前触发表单提交事件,该事件将来自各个日/月/年输入的值一起附加到单独的隐藏输入中,然后改为验证隐藏输入。

      【讨论】:

        【解决方案3】:

        你添加一个隐藏字段

        <input id="month" maxlength="2" name="month" type="text"  /> 
        <input id="day" maxlength="2" name="day" type="text" /> 
        <input id="year" maxlength="4" name="year" type="text"  /> 
        
        <input id="birthday"  name="birthday" type="text"  /> 
        

        然后连接隐藏中的值,并验证该字段。

        $('#day,#month,#year').change(function() {  
          $('#birthday').val($('#day').val()+'/'+ $('#month').val()+'/'+ $('#year').val());
        });  
        

        然后验证隐藏的值。

        【讨论】:

        • 这真的很有用,我在隐藏字段中添加了一个 minlength 以确保所有元素都已被选中。
        • 您可能需要在该隐藏字段上触发 keyup 事件,以便一切正常。当您出于某种原因在隐藏字段上执行 val(...) 时,不会触发验证。所以将其更改为 :$('#birthday').val($('#day').val( )+'/'+ $('#month').val()+'/'+ $('#year').val()).trigger('keyup');
        【解决方案4】:

        我很确定验证插件只支持验证输入,而不支持任意 DOM 元素。元素函数过滤掉任何不是元素的东西,以及提交、重置、图像按钮和禁用的输入。

        您想要做的是拥有月、日和年的验证器。为了执行正确的验证逻辑,月份和日期需要相互引用对方的值。

        【讨论】:

        • 无论如何都要汇总错误...所以我不需要月份,需要日期,需要年份。我想我可以这样做:如果 Month 无效,请跳过对日期和年份的验证?
        猜你喜欢
        • 1970-01-01
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        相关资源
        最近更新 更多