jQuery 验证日期范围问题

2024-06-19

我的代码中有很多地方有成对的相关开始和结束日期字段(范围)。我需要验证开始日期早于结束日期。我正在使用 jQuery 验证插件。

这是我的代码:http://jsfiddle.net/jinglesthula/dESz2/ http://jsfiddle.net/jinglesthula/dESz2/

Markup:

<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
    }
  });
});

我想做到这一点,以便每当一个日期字段发生变化时,我都会进行检查以确保范围有效(例如开始

我遇到的问题是,如果我输入有效范围,然后将结束日期的年份更改为开始日期年份的前一年,它将清除开始日期的错误,但不会清除错误在结束日期字段上。我已经调试并进入了 dateAfter 方法,看到它返回 true!我什至可以(无需进一步修改字段值)点击提交按钮,然后错误清除并提交表单。

知道为什么不清除它吗?

edit为了进一步澄清我正在采取的重现步骤:

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

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

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

this.element(end);

becomes

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery 验证日期范围问题 的相关文章

  • 基于布尔 prop 的条件字段验证

    我想要favoriteAlcohol仅当以下情况时才需要验证 需要的字段props isAdult传递给组件的是true Yup object shape favoriteAlcohol Yup string when props isAd
  • Angular 资源测试:$httpBackend.flush() 导致意外请求

    我想测试 angularjs 资源 use strict AddressService provides functionality to use address resource in easy way This is an exampl
  • 循环结束后从头开始重新迭代 for 循环 - JS

    我有一个数组和一个对象数组 我基本上需要将数组的第一个元素映射到数组内对象的第一个元素 依此类推 两个数组的长度都可以是可变的 并且一旦循环结束 循环应该从头开始 但是 我不确定是否再次开始循环 这是我的代码 const colors 7c
  • 更改 c3.js 散点图中气泡的大小

    我有一个散点图 我想改变点的大小 使它们看起来像气泡 有人可以告诉我如何改变气泡的大小吗 这是我的代码 var chart c3 generate data xs IBM ibm x Microsoft microsoft x column
  • Vuex 2.0 调度与提交

    有人可以解释一下什么时候使用调度和提交吗 我理解提交会触发突变 调度会触发操作 然而 派遣不也是一种行动吗 正如你所说 dispatch触发一个动作 并且commit触发突变 以下是如何使用这些概念 你总是用 dispatch来自路线 组件
  • 按空格键后执行JS代码

    这是我的 JavaScript 代码 var changeIdValue function id value document getElementById id style height value document getElement
  • 如何通过 Javascript 获取 Bootstrap 版本?

    有没有办法通过调用函数来获取Bootstrap版本 我做了一些研究 但找不到任何方法 版本信息包含在开头的注释中 如下所示 引导程序 v3 3 7 http getbootstrap com http getbootstrap com 版权
  • JavaScript 在对象中创建数组并将数据推送到数组

    我是编程新手 我正在尝试 React 并具有函数 addComment 当用户向新闻添加评论时执行该函数 此时我需要创建一个属性comments 数组 并分配或推送到该数组输入评论值价值 但现在我只重写了数组的 0 个元素 无法添加新元素
  • 从 ElementFinder 数组创建 ElementArrayFinder

    这是一个后续问题当条件评估为 true 时获取元素 扩展 ElementArrayFinder https stackoverflow com questions 32572299 take elements while a conditi
  • 使用 jQuery 将文本分解到随机位置

    有一些 jQuery 示例 介绍如何内爆文本 如下所示 http jsfiddle net doktormolle dNXVx http jsfiddle net doktormolle dNXVx 我怎样才能做到相反 我想将跨度元素中的字
  • Apex 图表自定义工具提示 - 如何获取类别名称和颜色?

    我想在 Apex Charts 中创建自定义工具提示 以下是官方文档中的建议 tooltip custom function series seriesIndex dataPointIndex w return div class arro
  • 类型错误:app.makeSingleInstance 不是函数

    从 Electron v2 0 3 升级到最新版本 v5 0 1 当我尝试运行电子时 出现以下错误 TypeError app makeSingleInstance is not a function 我相信这是因为 api 已经改变了 我
  • jqGrid 3.4 中的自定义数据工具提示

    我一直在使用优秀的 jqGrid 插件 它运行得很好 不过最近 我被要求为网格实现一些自定义工具提示 现在文档 http www secondpersonplural ca jqgriddocs index htm非常彻底 但它没有解决如何
  • JavaScript 检查 null 与 undefined 以及 == 和 === 之间的区别

    如何检查变量是否null or undefined和有什么区别null and undefined 有什么区别 and 很难在 Google 上搜索 如何检查变量是否null or undefined 是变量null if a null o
  • 如何在html5画布中向前和向后移动圆圈中的对象?

    我正在 html5 canvas 中开发一个小应用程序 我需要使用键盘按键以圆周运动移动对象 我可以使用键盘按键移动对象 但存在错误 该对象不会从同一位置向后或向前移动 任何人都可以帮助我完成此操作 请检查以下代码 任何形式的帮助将非常感激
  • 在 React 中渲染来自 Firebase 的数据

    请帮助我渲染从 Firebase 实时数据库检索的数据 我成功从 Firebase 中以数组形式检索数据 下一步是显示数据 问题就从这里开始了 我想要显示的数据应该存储在 模块 状态 首先 它被设置为一个空数组 然后检索数据 通过 Coum
  • 在 contenteditable div 中的插入符处插入 html

    我有一个带有 contenteditable 设置的 div 并且我正在使用 jquery 捕获按键 以在按下 Enter 键时调用 PreventDefault 如同这个问题 https stackoverflow com questio
  • 在函数字符串上使用 eval

    我在做 eval function console log Hello World 但这给出了错误 Uncaught SyntaxError Unexpected token 为什么这是错误的 The eval操作员期望Program作为输
  • jquery mousewheel:检测轮子何时停止?

    我正在使用 Jquery鼠标滚轮 http plugins jquery com project mousewheel插件 我希望能够检测用户何时完成使用轮子 与可拖动内容中的 stop 事件类似的功能 有人能指出我正确的方向吗 这里真的没
  • 提交ajax表单并停留在同一页面不起作用

    我想将用户的评论存储在我的数据库中 当用户提交时 我不想将他们重定向到新页面 我有以下代码 但它不起作用 我的 HTML 代码

随机推荐