这与这个问题有关:选择最小值和最大值的验证
所以我有两个字段,一个用于最小值,一个用于用户必须输入的maxim。我需要在这两个字段上进行验证,以确保它们是正确的最小值<最大值。>
我有以下代码
$.validator.addMethod('lessthan', function (value, element, params) {
var greatElement, validator, less, greatText, isEqualValid, great;
greatElement = $(params[0]);
// This code does not work
//validator = $( greatElement[0].form ).validate();
//validator.element(greatElement);
// This code does not work
greatElement.valid();
// validate the current value
// missing for brevety
});
$.validator.unobtrusive.adapters.add('lessthan', ['compareto', 'isequalvalid'], function (options) {
var element = $(options.form).find('input[name=' + options.params['compareto'] + ']')[0];
options.rules['lessthan'] = [element, options.params['isequalvalid']];
options.messages['lessthan'] = options.message;
});
但是,当我尝试验证当前字段的另一个字段时,即使 aria-invalid 不是真的,也不会删除输入验证错误类。
如何触发验证函数中其他字段的验证?
更新 我应该提到,我需要修复的情况是在我更改其中一个字段(键控或丢失焦点(时执行验证时。
示例:我有最小 2 和最大 5。 我将 min 更改为 23,两个字段都变得无效,并且错误类与它们相关联 我将最小值更改为 3,只有最大值字段才有效。即使验证函数返回有效字段,min 字段仍然无效。
经过进一步调查,我发现了我的问题。似乎当你在内部调用validator.element函数时,它会设置一个属性currentElements。所以基本上你正在改变正在验证的当前元素。
所以为了解决我的问题,我将当前元素设置回正在验证的元素
$.validator.addMethod('lessthan', function (value, element, params) {
var greatElement, validator, less, greatText, isEqualValid, great;
greatElement = $(params[0]);
validator = $( greatElement[0].form ).validate();
validator.element(greatElement);
// THIS IS THE LINE ADDED
validator.currentElements = $(element);
// validate the current value
// missing for brevety
});
$.validator.unobtrusive.adapters.add('lessthan', ['compareto', 'isequalvalid'], function (options) {
var element = $(options.form).find('input[name=' + options.params['compareto'] + ']')[0];
options.rules['lessthan'] = [element, options.params['isequalvalid']];
options.messages['lessthan'] = options.message;
});
当然,您可以在调用 validator.element 之前获取以前的 currentElements,并在调用后将其重新设置。
组可能有替代方案,但似乎 html5 标签不支持组,因此实现起来可能更棘手。
使用正确的解决方案进行更新
由于我没有使用 form.validate(settings( 并且 html5 标签不支持组,因此我不得不实现一个替代解决方案:
$(document).ready(function () {
$('[data-val-lessthan-groupname]').each(function () {
var validator = $(this.form).validate();
validator.groups[this.name] = $(this).data('val-lessthan-groupname');
validator.invalid[this.name] = true;
});
});
所以基本上我正在为最小值和最大值设置一个组名。在准备好的文档中,我正在获取验证器并为表单元素设置组名称。此外,我设置该元素有效,否则只有在元素"验证"后才会执行验证(在控件中设置焦点并失去对它的焦点或提交([似乎该组的开发只是考虑到required_from_groups,因此如果其他字段的值已更改,它会验证它们]