【问题标题】:How can I validate that the max field is greater than the min field?如何验证 max 字段是否大于 min 字段?
【发布时间】:2013-01-15 21:22:56
【问题描述】:

我在表单中有几组最小值和最大值字段,用户可以通过填写最小值和最大值来指定范围。我正在使用 jQuery 的 Validate 插件进行表单验证。我想设置一个验证规则,强制最大字段大于最小值。每当更改最大 最小字段值时,都会调用此方法。

我知道我可以像这样设置某种基本的自定义验证方法:

$.validator.addMethod("greaterThan",
    function(value, max, min){
        return parseInt(value) > parseInt($(min).val());
    }, "Max must be greater than min"
);

然后为最大元素添加一条规则:

rules: {
    maxTruck: {greaterThan: '#minTruck'}
}

但这有点复杂,因为这仅适用于更改 max 字段时,而不是 min。有什么简单的方法可以做到这一点,而不必编写 lessThan 方法并将其应用于 min 字段?

然后我想解决的另一件事 - 有没有什么简单的方法可以通用地应用它,而不必枚举每个最大字段以及它映射到哪个最小值?这样我就可以有一个 min 和 max 类并调用类似:

$(".max").rules('add', { greaterThan: ".min" });

并且以某种方式设置了能够确定(可能基于共享属性?)max字段与哪个最小值配对的方法?

更新:

我在这篇文章中提到的基本逻辑可以在this jsfiddle 中看到。但是,我并没有真正做这么多 - 我正在寻找一种逻辑,以按照我描述的方式基本上链接最小和最大字段集。而且我不知道这是否是最好的方法 - 正如我所提到的,我希望能够通用地做到这一点,这样我就不必通过 id 来引用 min 和 max 字段。

【问题讨论】:

  • 我认为如果你能提供一个 fiddle 将是一个很好的开始?!
  • 请大大澄清这个问题。一开始你说,“每当改变最大或最小字段值时调用”。但后来你说,“仅在更改最大字段时适用”。它是哪一个?验证发生在 keyupfocusout 事件上,因此无需担心“何时更改”。
  • 除了 jsFiddle,请在问题中发布您的 HTML。您已经拥有足够的声誉来了解这一点。我想帮助你,但仍然缺少太多。
  • @Sparky - 我希望在更改最小或最大字段时应用验证逻辑的行为,但我提供的代码仅在更改最大字段时适用。
  • 这听起来可能比实际上更复杂......再次,为我们提供一个简洁的例子。如果我回答这个问题,我可以毫无问题地构建一个 jsFiddle 演示来配合它。您至少可以提供表单的 HTML。

标签: jquery jquery-validate


【解决方案1】:

好的,这应该是可行的。该规则基于内置的equalTo 方法:

$.validator.addMethod("greaterThan", function (value, element, param) {
    var $min = $(param);

    if (this.settings.onfocusout) {
        $min.off(".validate-greaterThan").on("blur.validate-greaterThan", function () {
            $(element).valid();
        });
    }

    return parseInt(value) > parseInt($min.val());
}, "Max must be greater than min");

示例: http://jsfiddle.net/tUPQc/2/


要使规则更通用,您必须使用addClassRules

$.validator.addMethod("greaterThan", function (value, element, param) {
    var $element = $(element)
        , $min;

    if (typeof(param) === "string") {
        $min = $(param);
    } else {
        $min = $("#" + $element.data("min"));
    }

    if (this.settings.onfocusout) {
        $min.off(".validate-greaterThan").on("blur.validate-greaterThan", function () {
            $element.valid();
        });
    }
    return parseInt(value) > parseInt($min.val());
}, "Max must be greater than min");

$.validator.addClassRules({
    greaterThan: {
        greaterThan: true
    }
});

然后在你的 HTML 中:

<input id="maxTruck" name="maxTruck" type="text" class="number greaterThan" data-min="minTruck" />

示例: http://jsfiddle.net/tUPQc/3/

【讨论】:

  • +1 - 我只会稍微调整一下以满足@froadie 使用 classRules 的要求。见jsfiddle.net/mccannf/Bxxmj/2。在输入中需要 data-linked 属性。
  • @mccannf:谢谢——我错过了这个问题。你介意我把你的小提琴加入答案吗?
  • 谢谢,这看起来很棒!但是有一个问题 - 每次更改/击键时都会验证最大字段,但只有当您离开该字段时才会验证最小值......有什么方法可以让最小值表现相同?
  • 如何应用此字段以便不需要该字段?
  • 回答我自己的问题:更改这一行:return parseInt(value) > parseInt($min.val());为此:返回 this.optional(element) || parseInt(值) > parseInt($min.val());希望它可以帮助某人
【解决方案2】:

简单又好用的addmethod方法

$.validator.addMethod("greaterThan",

function (value, element, param) {
  var $min = $(param);
  if (this.settings.onfocusout) {
    $min.off(".validate-greaterThan").on("blur.validate-greaterThan", function () {
      $(element).valid();
    });
  }
  return parseInt(value) > parseInt($min.val());
}, "Must be greater than to field 1");

验证码

filed2_name: {

            greaterThan: '#filed1_id'
        },  

第二个我更喜欢第一个

$.validator.addMethod('le', function(value, element, param) {
      return this.optional(element) || value <= $(param).val();
}, 'Invalid value');
$.validator.addMethod('ge', function(value, element, param) {
      return this.optional(element) || value >= $(param).val();
}, 'Invalid value');

$('form').validate({rules: {
            fieldName1: {le: '#fieldID2'},
            fieldName2: {ge: '#fieldID1'},
             ...
      },
      messages: {
            fieldName1: {le: 'Must be less than or equal to field 2'},
            fieldName2: {ge: 'Must be greater than or equal to field 1'},
            ...
      }
});

【讨论】:

  • 如果你搞砸了为什么不工作,请确保你比较的是 int 而不是 html 值,它是字符串。 $.validator.addMethod('greaterThanOrEqual', function(value, element, param) { return this.optional(element) || parseInt(value) >= parseInt($(param).val()); }, '无效范围');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2021-09-11
  • 2021-03-03
  • 1970-01-01
相关资源
最近更新 更多