【发布时间】:2014-02-28 23:26:54
【问题描述】:
我的代码中有很多地方有成对的相关开始和结束日期字段(范围)。我需要验证开始时间是否在结束日期之前。我正在使用 jQuery 验证插件。
这是我的代码:http://jsfiddle.net/jinglesthula/dESz2/
标记:
<form id="myform">
<input type="text" name="startDate" id="startDate" class="validDate" />
<br/>
<input type="text" name="endDate" id="endDate" class="validDate" />
<br/>
<input type="submit" />
</form>
js:
$(function() {
// simple date mm/dd/yyyy format
$.validator.addMethod('validDate', function(value, element) {
return this.optional(element) || /^(0?[1-9]|1[012])[ /](0?[1-9]|[12][0-9]|3[01])[ /][0-9]{4}$/.test(value);
}, 'Please provide a date in the mm/dd/yyyy format');
$.validator.addMethod('dateBefore', function(value, element, params) {
// if end date is valid, validate it as well
var end = $(params);
if (!end.data('validation.running')) {
$(element).data('validation.running', true);
this.element(end);
$(element).data('validation.running', false);
}
return this.optional(element) || this.optional(end[0]) || new Date(value) < new Date(end.val());
}, 'Must be before corresponding end date');
$.validator.addMethod('dateAfter', function(value, element, params) {
// if start date is valid, validate it as well
var start = $(params);
if (!start.data('validation.running')) {
$(element).data('validation.running', true);
this.element(start);
$(element).data('validation.running', false);
}
return this.optional(element) || this.optional(start[0]) || new Date(value) > new Date($(params).val());
}, 'Must be after corresponding start date');
$('#myform').validate({ // initialize the plugin
rules: {
startDate: {dateBefore: '#endDate', required: true},
endDate: {dateAfter: '#startDate', required: true}
},
submitHandler: function (form) { // for demo
alert('valid form submitted'); // for demo
return false; // for demo
}
});
});
我想这样做,以便每当一个日期字段发生更改时,我都会检查以确保范围有效(例如 start
我遇到的是,如果我输入一个有效范围,然后将结束日期的年份更改为开始日期年份之前的年份,它将清除开始日期的错误,但不会清除结束日期字段上的错误。我已经调试并进入 dateAfter 方法并看到它返回 true!我什至可以(无需进一步修改字段值)点击提交按钮,然后错误清除并提交表单。
知道为什么它没有清除它吗?
编辑为了进一步阐明我要重现的步骤:
- 在开始字段(第一个)中输入 01/01/2014
- 在结尾字段中输入 01/01/2015
- 将结束字段年份中的 5 更改为 3
- 选择 3 并再次输入 5
- start 字段清除了它的错误,但 end 仍然在抱怨 range start/end
- 单击或跳出以模糊结束字段 - 仍然没有清除错误
- 点击结束字段
- Shift+Tab 返回起始字段
- 现在结束字段(最终)清除错误消息(您也可以提交表单以查看它清除结束字段错误)
- 哇? 0 wai ??!!!!??!??!!!111!!!一个!!!!11!!!1!!!
【问题讨论】:
-
附加说明:我想要的是当范围无效时,两个字段都无效,一旦平衡恢复,两个字段都重新验证。 data('validation.running', bool) 是为了避免无限循环。用户可以通过改变开始或结束来恢复力的平衡。
-
我无法通过给出的步骤重现您的问题。结束消息在步骤 7-8 中未清除。
-
很抱歉造成混乱!我更新了步骤以更好地反映我在做什么。最终消息没有清除(并且即使我正在观察 dateAfter 方法运行并返回 true,也没有在应该清除的时候清除)这一事实是有问题的问题。第 5 步是首先演示问题的地方。第 9 步是没有出现问题的地方(这令人沮丧,为什么它会在那里工作而不是回到第 5 步)。
标签: javascript jquery validation jquery-validate