2009-09-04 2 views
4

Я использую jQuery Validate и хотел бы повторно проверить группу полей всякий раз, когда один из них изменяется (или, возможно, когда один из них успешно проверяется). Мои попытки пока только создают бесконечные петли.jQuery Validate - могу ли я повторно проверить группу полей после ее изменения?

Возможно ли это, или дизайн плагина исключает его?

(В частности, у меня есть a method that requires at least X of group Y to be filled out, и как только это правда, я бы хотел, чтобы все эти поля повторно проверялись. В настоящее время я очищаю свои сообщения об ошибках своим кодом, но это взломать - она ​​также скрывает несвязанные проблемы проверки, пока форма не будет повторно представлена)

+0

Это до или после отправки формы? – staterium

+0

@ Ravish - в основном после того, как предполагалось, что представление было заблокировано и предоставлены ошибки, но раньше тоже было бы хорошо. –

+0

У вас есть ссылка на страницу с примерами? – PetersenDidIt

ответ

12

метод Validate имеет few options to support re-validating on change, а именно это:

$(".selector").validate({ 
    onfocusout: true, 
    onkeyup: true, 
    onclick: true, 
    //The rest of your options 
}); 

все это по умолчанию false, но должна предложить функциональность вы упоминаете. в вопросе.

Обновление на основе комментариев: Предоставлено простая форма теста, как это:

<form action="get"> 
    <div><input type="text" name="part1" class="part"></div> 
    <div><input type="text" name="part2" class="part"></div> 
    <div><input type="text" name="part3" class="part"></div> 
    <div><input type="text" name="part4" class="part"></div> 
    <input type="submit" value="Submit" /> 
</form> 

JQuery будет следующим:

jQuery.validator.addMethod("require_from_group", function(value, element, options) { 
    var valid = $(options[1], element.form).filter(function() { 
     return $(this).val(); 
    }).length >= options[0]; 

    if(!$(element).data('reval')) { 
     var fields = $(options[1], element.form); 
     fields.data('reval', true).valid(); 
     fields.data('reval', false); 
    } 
    return valid; 
}, jQuery.format("Please fill out at least {0} of these fields.")); 

$("form").validate({ 
    rules: { 
     part1: { require_from_group: [2,".part"] }, 
     part2: { require_from_group: [2,".part"] }, 
     part3: { require_from_group: [2,".part"] }, 
     part4: { require_from_group: [2,".part"] } 
    } 
});​ 

Вы можете играть с демо здесь, посмотреть, это то, что вы после: http://jsfiddle.net/mhmBs/

Метод здесь использует .data(), чтобы элемент знал, что вызывают бесконечный цикл. Фактический элемент, который редактируется, при размытии (обычная причина для триггеров проверки) повторно подтверждает только других элементов в селекторе, который вы указали в группе, поэтому не вся форма, как мой комментарий ... это только срабатывает на минимальное количество элементов.

+0

Каждый из этих параметров связан с повторной проверкой текущего поля. Я пытаюсь повторно проверить поля, относящиеся к текущему. Другими словами, сказать: «Если это поле проходит проверку, подтвердите два других поля одного и того же класса» или что-то подобное. –

+1

@Nathan - запускает полную форму для повторной проверки опции при изменении этих полей? –

+0

@ Ник - конечно, это сработает. –

2

Dont знаю, как это работает, но только обнаружил, что удаление ниже часть:

if(!$(element).data('reval')) { 
     var fields = $(options[1], element.form); 
     fields.data('reval', true).valid(); 
     fields.data('reval', false); 
} 

кода из основного кода сделать все валидация работать нормально и ожидалось. :)

Смежные вопросы