Javascript 如何验证3个字段中的日期输入?

Javascript 如何验证3个字段中的日期输入?,javascript,jquery-validate,Javascript,Jquery Validate,我有3个字段用于日期输入: <input type="text" id="passport-doi-1" name="passport-doi-1" placeholder="DD" maxlength="2"> <input type="text" id="passport-doi-2" name="passport-doi-2" placeholder="MM" maxlength="2"> <input type="text" id="passport-doi

我有3个字段用于日期输入:

<input type="text" id="passport-doi-1" name="passport-doi-1" placeholder="DD" maxlength="2">
<input type="text" id="passport-doi-2" name="passport-doi-2" placeholder="MM" maxlength="2">
<input type="text" id="passport-doi-3" name="passport-doi-3" placeholder="YYYY" maxlength="4">

您的方法是正确的——您需要传递
日期
构造函数编号,而不是字符串(
val
将返回字符串)。您还可以利用自定义规则的
params
参数使其更具可扩展性(不特定于三个具有特定
id
s的字段):

我认为
group
选项仅用于对错误消息进行分组(因此您仍然必须为每个输入定义验证规则)


示例:

谢谢,它工作得很好。有没有什么方法可以引用
而不是
日期字段
的创建和使用?@laux:一个简单的方法是在
日期字段
中使用相同的数组,并在分配
属性时——请参阅我的更新答案。嗯,发现了一个与此代码相关的错误-如果用户输入日期和月份,但是没有输入年份,那么它就被视为有效的(因为年份元素是可选的),但它不应该是完整的日期或者什么都没有。是的,现在就可以了。我还在年份字段中添加了
range:[193012]
,否则甚至
1
也被接受。刚才我注意到它接受了错误的日期,如2000年13月33日。看起来像是
!isNaN(date.getTime()
是验证日期的不正确方法-请参阅
$.validator.addMethod('validDate', function (value, element) {
  var dd = $("#passport-doi-dd").val();
  var mm = $("#passport-doi-mm").val();
  var yyyy = $("#passport-doi-yyyy").val();
  if (dd=="" && mm=="" && yyyy=="") return true;
  try {
    var date = new Date(yyyy,mm-1,dd,0,0,0,0);
    return mm===(date.getMonth()+1) && dd===date.getDate() && yyyy===date.getFullYear();
  }
  catch(er) {
    return false;
  }
}, 'Please use format DD MM YYYY.');

  ...
  rules: {
    "passport-doi-dd": {
      required: false,
      validDate: true,
      range: [1, 31]
    }, 
    "passport-doi-mm": {
      required: false,
      validDate: true,
      range: [1, 12]
    }, 
    "passport-doi-yyyy": {
      required: false,
      validDate: true,
      range: [1990, 2012]
    }
  },
  messages: {
    "passport-doi-dd": "Please use format DD MM YYYY.",
    "passport-doi-mm": "Please use format DD MM YYYY.",
    "passport-doi-yyyy": "Please use format DD MM YYYY."
  }
$.validator.addMethod("multidate", function (value, element, params) {
  var daySelector = params[0]
      , monthSelector = params[1]
      , yearSelector = params[2]
      , day = parseInt($(daySelector).val(), 10)
      , month = parseInt($(monthSelector).val(), 10)
      , year = parseInt($(yearSelector).val(), 10)
      , date = new Date(year, month, day);

  return (!$(daySelector).val() && !$(monthSelector).val() && !$(yearSelector).val()) || 
    !isNaN(date.getTime());

});


$(document).ready(function () {
  var dateFields = ["#passport-doi-1", "#passport-doi-2", "#passport-doi-3"];
  $("#dateform").validate({
    errorLabelContainer: "#errors",
    groups: {
      date: dateFields.join("")
    },
    rules: {
      "passport-doi-1": {
        multidate: dateFields
      },
      "passport-doi-2": {
        multidate: dateFields
      },
      "passport-doi-3": {
        multidate: dateFields
      }
    },
    messages: {
      "passport-doi-1": {
        multidate: "Please enter a valid date"
      },
      "passport-doi-2": {
        multidate: "Please enter a valid date"
      },
      "passport-doi-3": {
        multidate: "Please enter a valid date"
      }
    }
  });
});