jQuery Validate Plugin: как добавить группы в валидатор после его инициализации?

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

поскольку валидатор формы уже инициализирован, мне нужно добавить несколько вещей динамически. Плагин предоставляет метод rules ("add", rules ) для добавления в правила проверки динамически, хотя мы просто используем имена классов, чтобы сделать это в любом случае. Но нет четкого способа установить параметр groups после инициализации валидатора.

Я пробовал несколько разных вещей, чтобы выполнить это, но никто не работает:

var settings = $("#mc-embedded-subscribe-form").validate().settings;
$("#mc-embedded-subscribe-form").validate($.extend(settings, {
    groups: {
        username: "FNAME LNAME"
    },
    errorPlacement: function(error, element) {
        if (element.attr("name") == "FNAME" || element.attr("name") == "LNAME") {
            error.insertAfter("#username_group");
        } else {
            error.insertAfter(element);
        }
    }
}));

функция errorPlacement добавляется в валидатор, но не в группы.

Я также попытался явно установить параметр groups, но это также не имеет никакого эффекта.

$("#mc-embedded-subscribe-form").validate().settings.groups = { username: "FNAME LNAME" };
$("#mc-embedded-subscribe-form").validate().groups = { username: "FNAME LNAME" };

Я совершенно в тупике, как это сделать.

4 ответов


Я тоже искал способ сделать это и нашел решение на форуме справки jQuery:http://forum.jquery.com/topic/jquery-validate-defining-groups-dynamically


Я недавно столкнулась с той же проблемой и нашел другое решение.

Сценарий

у нас есть таблица, которая растет динамически по мере добавления (или удаления) строк пользователями. Каждая новая строка содержит несколько элементов, и мы хотим, чтобы входные элементы каждой строки были в одной группе проверки-по одному на строку-потому что мы хотим только одну метку ошибки для каждой строки. Потому что строки добавляются динамически-хорошо после вызова $('#the-form').validate ()--нам нужен способ добавить новую группу каждый раз, когда пользователь добавляет строку.

Решение

мы взломали объект validator, напрямую изменив его член группы:

// on document ready:
validator = $('#the-form').validate({
    groups: ...,
    rules: ...,
    messages: ...,
    etc.
});

...

// later, when we need to add a new validation group:
validator.groups['first_name_row_5'] = 'full_name';
validator.groups['last_name_row_5'] = 'full_name';

последние две строки эквивалентны

groups: {full_name: 'first_name_row5 last_name_row_5'}

в параметрах валидатора, но может быть добавлен после первоначального вызова validate ().

это взлом внутренних частей jquery.проверить, но он работает (с jQuery validate v1.9.0).


наконец, непосредственно ответьте на вопрос OP: вместо этого:

$("#mc-embedded-subscribe-form").validate().groups = { username: "FNAME LNAME" };

попробуйте это:

var validator = $("#mc-embedded-subscribe-form").validate();
validator.groups['FNAME'] = 'username';
validator.groups['LNAME'] = 'username';

Я пробовал каждый метод, который мог найти, чтобы динамически добавлять группы. Единственный, который работал для меня, был основан на методе Рона выше. У меня была таблица с динамически добавляемыми строками, каждая из которых содержала несколько полей.

// Names of fields within each table row that's dynamically added
var validateNames=["field1","field2","field3"];    

// This function overwrites all validator groups and is called during each change of the table
function createGroups() {

    var result = {};

    // Create any static groups    
    result['date-dd'] = result['date-mm'] = result['date-yyyy'] = 'date';

    // Create groups from dynamically added table rows
    var i = 1;
    jQuery("tr", "#table-id tbody").each(function() {

        for (j = 0; j < validateNames.length; ++j) {
            result[validateNames[j] + "-" + i] = 'fieldGroup_' + i;
        }

        i++;
    });    

    validator.groups = result;
}

put one errorElement:" span", который используется для отображения ошибки в нужном месте. где username_group кодировать в пределах тега span

$("#mc-embedded-subscribe-form").validate($.extend(settings, {     

группы: {
имя пользователя:" FNAME LNAME"},
errorElement:"span" ,

errorPlacement: функция(ошибка, элемент) {
if (element.attr ("name") = = "FNAME" | | элемент.attr ("name") = = " LNAME") { ошибка.insertAfter("#username_group");
} еще {
ошибка.insertAfter (element);

} } }));