在“require_from_group_exact”验证的输入之前使用任何输入进行 jQuery 验证都无法正确验证

jQuery validation with any inputs before an 'require_from_group_exact' validated input does not validate properly

本文关键字:验证 输入 任何 jQuery group from require exact      更新时间:2023-09-26

我正在使用jQuery验证插件来验证html页面上的许多输入。 名字始终是必需的,可以是电子邮件或移动设备,但不能两者兼而有之。 为此,我使用 require_from_group_exact 方法。

当输入按此顺序排列时,验证将完美进行:

<form>
  Email: <input class="commsinfo" name="email"><br>
  Mobile: <input class="commsinfo" name="mobile"><br>
  Name: <input name="firstname"><br>
  <input type="submit">
</form>

但是,如果您交换输入,则无法正确验证最后一个输入(名字)(您必须键入名字,然后将其删除以触发验证) - 为什么??。 这是我正在尝试解决的所需顺序和问题 - 这是 jQuery 验证插件或我的代码的错误吗?

<form>
  Name: <input name="firstname"><br>
  Email: <input class="commsinfo" name="email"><br>
  Mobile: <input class="commsinfo" name="mobile"><br>
  <input type="submit">
</form>

我已经创建了未正确验证版本的 JSFiddle。 jQuery.validator.addMethod 和 $('form').validate 的代码可以在小提琴中看到。

您没有检查所有输入字段,

更改var fields = $(selector, element.form);

var fields = $('form :input');

更新的小提琴

在您

提供的示例中,调用fields.valid()似乎存在问题。

我已经更新了小提琴以删除一些我认为您不需要的代码。对valid()的调用似乎是问题的症结所在,删除它会导致验证按预期工作。

更新后的代码现在如下所示:

jQuery.validator.addMethod("require_from_group_exact", function(value, element, options) {
  var validator = this;
  var selector = options[1];
  var validOrNot = $(selector, element.form).filter(function() {
    return validator.elementValue(this);
  }).length == options[0];
  return validOrNot;
}, jQuery.format("Please fill {0} of these fields."));
$('form').validate({
  rules: {
    firstname: { required: true },
    email: { require_from_group_exact: [1, ".commsinfo"] },
    mobile: { require_from_group_exact: [1, ".commsinfo"] },
  }
});

更新的小提琴

每次调用

fields.valid();

您的验证器方法被召回,因此您会出现明显奇怪的行为。您可以自己检查此调试。