【问题标题】:jQuery validation date range issuejQuery验证日期范围问题
【发布时间】: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!我什至可以(无需进一步修改字段值)点击提交按钮,然后错误清除并提交表单。

知道为什么它没有清​​除它吗?

编辑为了进一步阐明我要重现的步骤:

  1. 在开始字段(第一个)中输入 01/01/2014
  2. 在结尾字段中输入 01/01/2015
  3. 将结束字段年份中的 5 更改为 3
  4. 选择 3 并再次输入 5
  5. start 字段清除了它的错误,但 end 仍然在抱怨 range start/end
  6. 单击或跳出以模糊结束字段 - 仍然没有清除错误
  7. 点击结束字段
  8. Shift+Tab 返回起始字段
  9. 现在结束字段(最终)清除错误消息(您也可以提交表单以查看它清除结束字段错误)
  10. 哇? 0 wai ??!!!!??!??!!!111!!!一个!!!!11!!!1!!!

【问题讨论】:

  • 附加说明:我想要的是当范围无效时,两个字段都无效,一旦平衡恢复,两个字段都重新验证。 data('validation.running', bool) 是为了避免无限循环。用户可以通过改变开始或结束来恢复力的平衡。
  • 我无法通过给出的步骤重现您的问题。结束消息在步骤 7-8 中未清除。
  • 很抱歉造成混乱!我更新了步骤以更好地反映我在做什么。最终消息没有清除(并且即使我正在观察 dateAfter 方法运行并返回 true,也没有在应该清除的时候清除)这一事实是有问题的问题。第 5 步是首先演示问题的地方。第 9 步是没有出现问题的地方(这令人沮丧,为什么它会在那里工作而不是回到第 5 步)。

标签: javascript jquery validation jquery-validate


【解决方案1】:

啊,想通了(或者至少解决了这个问题)。验证插件可能未设计为允许在给定字段的方法运行中验证第二个字段。可能存在对当前正在验证的字段的内部引用,因此您需要按顺序进行验证,而不是重叠它们。

我在此处添加了对小提琴的更新,您可以在其中看到使用 setTimeout 确保“其他字段”在第一个确实解决问题后验证:http://jsfiddle.net/jinglesthula/dESz2/3/

this.element(end);

变成

setTimeout($.proxy(
  function () {
    this.element(end);
  }, this), 0);

我还为清除“validation.running”标志添加了一个 setTimeout,以确保在“其他”字段验证之前不会清除它。

【讨论】:

  • 注意:proxy() 调用是为了确保this 是正确的上下文,在这种情况下是验证器实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多