Проверить поле внутри функции проверки

Это связано с этим вопросом: проверка выбора минимума и максимума

Таким образом, у меня есть два поля, одно для минимума и одно для максима, которые пользователь должен ввести. Мне нужно проверить в обоих полях, что они верны. Minim

У меня есть следующий код

$.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 не соответствует действительности, класс input-validation-error не удаляется.

Как я могу запустить проверку для другого поля внутри функции проверки?

ОБНОВЛЕНИЕ Я должен упомянуть, что мне нужно исправить случай, когда проверка выполняется, когда я изменяю одно из полей (keyup или lostfocus).

Пример: у меня min 2 и max 5. Я изменяю min на 23, оба поля становятся недействительными, и с ними связан класс ошибок. Я изменяю min на 3, только поле max становится действительным. Поле min остается недействительным, даже если функция проверки верна.

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 в обратите внимание, поэтому он проверяет другие поля, если они имеют измененное значение]

Другие вопросы по тегам