2010-06-30 136 views
17

我一直在使用jQuery UI中的Datepicker插件。我希望能够验证它所附带的输入文本框当前是否具有有效日期。jquery datepicker:验证当前输入值?

例如:

如果有人决定如果电流输入值是一个有效的日期(这是不是在这种情况下),以输入02/30/2010我希望能够以某种方式要求该插件。

有谁知道这可以做到吗?

+3

。每次我尝试使用它时,我都非常惊讶于jQuery UI中的所有内容都不完整和不完整。多么可笑。 :( – 2013-04-18 11:24:40

回答

0

看看dateFormatconstrainInput datepicker的选项。 http://jqueryui.com/demos/datepicker/#option-dateFormat

+1

我不使用constrainInput,因为我希望人们能够使用斜线或破折号作为分隔符。但是,我不明白如何使用它可以让我知道是否有人进入一天如2月30日 – user169867 2010-06-30 13:55:47

+0

约束输入不能解决这个问题,它阻止我输入文本,不会阻止我输入“5” – 2013-04-18 11:26:30

+0

@DannyTuppeny - 可能值得注意,而你提到的是正确的, constraintInput不会阻止将文本剪切并粘贴到输入中 – webaholik 2018-02-13 14:11:24

0

我在验证器中添加了“truedate”方法。我非常想知道这是谁的代码,但我不记得我在哪里找到它。

$.validator.addMethod("truedate", function (value) { 
     function GetFullYear(year) { 
      var twoDigitCutoffYear = 10 % 100; 
      var cutoffYearCentury = 10 - twoDigitCutoffYear; 
      return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year)); 
     } 

    if (value == null || value == '') 
     return true; 
    var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$"); 
    try { 
     m = value.match(yearFirstExp); 
     var day, month, year; 
     if (m != null && (m[2].length == 4)) { 
      day = m[6]; 
      month = m[5]; 
      year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3])); 
     } 
     else { 
      var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})(?:\\s|\\2)((\\d{4})|(\\d{2}))(?:\\s\u0433\\.)?\\s*$"); 
      m = value.match(yearLastExp); 
      if (m == null) { 
       return null; 
      } 
      day = m[3]; 
      month = m[1]; 
      year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6])); 
     } 
     month -= 1; 
     var date = new Date(year, month, day); 
     if (year < 100) { 
      date.setFullYear(year); 
     } 
     return (typeof (date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null; 
    } 
    catch (err) { 
     return null; 
    } 
}, "Please enter an actual date."); 

$('form').validate({ 
       rules: { 
        insurance_GL: "truedate", 
       }, 
       messages: { 
        insurance_GL: "Insurance GL date is not valid", 
       } 
}); 

编辑 我必须从这里得到它: Jquery datepicker: validate date mm/dd/yyyy

8

您可以通过只读取和设置日期格式的文本框,只要你喜欢解决问题。所以用户无法在文本框中输入任何内容,用户只能从日期选择器中选择正确的日期格式(您设置的)。请看下面的例子。

<p>Date: <input type="text" id="datepicker" size="30" readonly="readonly"/></p>  
<script> 
$(function() { 
    $("#datepicker").datepicker(); 
    $("#datepicker").datepicker("option", "dateFormat",'yy-mm-dd'); 
}); 
</script> 
+23

这非常可用。有些用户宁愿输入他们的日期,也不愿意在日历上输入日期! – 2013-04-18 11:25:54

3

虽然这个问题是快两岁了,我最近处理了一个类似的解决方案,发现Globalize库是最好的办法。例如,假设你有一个连接了jQueryUI日期选择器的文本框。当焦点丢失在文本框上时,您可以使用Globalize来验证输入的日期。在这种情况下,文本框是空白,如果日期是无效或放在一个标准格式,如果日期是有效的:

$('#myDateTextBox').blur(function() { 
    var parsedDate = Globalize.parseDate($(this).val()); 
    if (parsedDate == null) { 
     $(this).val(''); 
    } 
    else { 
     $(this).val(Globalize.format(parsedDate, 'd')); 
    } 

Globalize库允许你指定一个文化(使用请求的语言理想),所以用户可以以他们的文化格式输入日期。

+0

我不认为各种文化的dateFormats甚至可以匹配Globalize和jQueryUi DatePicker。在globalize.culture.fr-CA.js中,我看到这样的日期格式:yyyy-MM-dd。在datepicker-fr-CA.js中,我看到这样的日期格式:yy-mm-dd。我不认为这两个日期格式标记是相同的。大写字母“M”与小写字母“m”是如何解释的? – ClearCloud8 2014-02-04 23:59:48

+0

@ ClearCloud8我编写了一个实用程序来生成jQueryUI datepicker本地化文件,以便它们与Globalize中使用的格式相匹配。 – 2014-02-05 14:25:47

+0

啊好的,这是有道理的。好主意。 :)它仍然让我发疯,为什么日期格式标记会被解释不一致。我知道momentJs期望大写MM,而jqueryUI Datepicker期望小写mm。拥有一致的方法会很好......或者至少有一些资源可以将不同软件中的令牌进行比较,并显示出等值。 – ClearCloud8 2014-02-05 16:47:59

-1

可以使用JS Date来验证日期字符串。

var myDate = new Date(userInputString); 

if (myDate == "Invalid Date"){ 
// user input is invalid 
} 

另请注意,即使对于无效日期,(myDate === "Invalid Date")也会返回false。使用==工作正常,但检查的正确方法是(isNaN(d.getTime()))

3

这很容易

let value = $(this).val(); 
let format = $(this).datepicker('option', 'dateFormat'); 
let valueIsValid = false; 
try { 
    $.datepicker.parseDate(format, value); 
    valueIsValid = true; 
} 
catch (e) {} 
今天我有完全相同的问题