Проверить поле внутри функции проверки
Это связано с этим вопросом: проверка выбора минимума и максимума
Таким образом, у меня есть два поля, одно для минимума и одно для максима, которые пользователь должен ввести. Мне нужно проверить в обоих полях, что они верны. Minim У меня есть следующий код Однако, когда я пытаюсь проверить другое поле для текущего поля, даже если aria-invalid не соответствует действительности, класс input-validation-error не удаляется. Как я могу запустить проверку для другого поля внутри функции проверки? ОБНОВЛЕНИЕ Я должен упомянуть, что мне нужно исправить случай, когда проверка выполняется, когда я изменяю одно из полей (keyup или lostfocus). Пример: у меня min 2 и max 5. Я изменяю min на 23, оба поля становятся недействительными, и с ними связан класс ошибок. Я изменяю min на 3, только поле max становится действительным. Поле min остается недействительным, даже если функция проверки верна.$.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;
});
1 ответ
После дальнейшего расследования я обнаружил свою проблему. Кажется, что когда вы вызываете функцию validator.element внутри, она устанавливает свойство currentElements. Таким образом, вы меняете текущий проверяемый элемент.
Таким образом, чтобы решить мою проблему, я устанавливаю 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;
});
Конечно, вы можете получить предыдущие currentElements перед вызовом validator.element и установить его обратно после вызова.
Может быть альтернатива с группами, но кажется, что группы не поддерживаются с тегами 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 в обратите внимание, поэтому он проверяет другие поля, если они имеют измененное значение]