【发布时间】:2010-12-25 17:29:45
【问题描述】:
我在表单上使用jQuery Validation plugin。我有一些字段组是可选的,但需要是“全部或全部” - 如果您在组中填写一个输入,则必须填写所有字段。
例如,假设用户可以输入一个位置(街道、城市、州和邮政编码)或多个位置。你不必输入第二个位置,但如果你这样做了,只给出城市是不行的;我也需要那个状态和 zip。
为了解决这个问题,我编写了一个自定义规则——实际上只是对my previous rule、require_from_group 的微小调整。这个叫skip_or_fill_minimum。以下是您的使用方法:
var validationrules = {
rules: {
location2address: {
skip_or_fill_minimum: [4,'.location2']
}
//This input will validate if all 4 `.location2` inputs are filled,
//or if all of them are left blank
}
var validator = $("#formtovalidate").validate(validationrules);
这是自定义规则的代码:
jQuery.validator.addMethod("skip_or_fill_minimum", function(value, element, options) {
var numberRequired = options[0];
var selector = options[1];
//Look for our selector within the parent form
var numberFilled = $(selector, element.form).filter(function() {
// Each field is kept if it has a value
return $(this).val();
}).length;
var valid = numberFilled >= numberRequired || numberFilled === 0;
//The elegent part - this element needs to check the others that match the
//selector, but we don't want to set off a feedback loop where all the
//elements check all the others which check all the others which
//check all the others...
//So instead we
// 1) Flag all matching elements as 'currently being validated'
// using jQuery's .data()
// 2) Re-run validation on each of them. Since the others are now
// flagged as being in the process, they will skip this section,
// and therefore won't turn around and validate everything else
// 3) Once that's done, we remove the 'currently being validated' flag
// from all the elements
if(!$(element).data('being_validated')) {
var fields = $(selector, element.form);
//.valid() means "validate using all applicable rules" (which includes this one)
fields.data('being_validated', true);
fields.validate(); //Changed from fields.valid();
fields.data('being_validated', false);
}
return valid;
// {0} below is the 0th item in the options field
}, jQuery.format("Please either skip these fields or fill at least {0} of them."));
我主要发布此内容,以便其他在网上搜索解决方案的人可以找到它。仍然 - 有没有人看到改进的方法?
更新 - 现在是 jQuery 验证的一部分
这是 2012 年 4 月 3 日的officially added to jQuery Validation。
【问题讨论】:
-
2010 年 4 月 9 日更新了优雅的部分,重新检查其他组成员而不会导致无限循环。该逻辑由 Nick Craver 提供 - 请参阅有关我的相关规则的问题:stackoverflow.com/questions/1378472/…
-
2010 年 8 月 22 日更新 - 在 fields.data 上将 .valid() 更改为 .validate();当只有这些字段返回 true 时,valid() 导致整个表单通过验证。
标签: jquery validation