JQuery проверить с динамическим числом полей - PullRequest
14 голосов
/ 20 июня 2009

У меня есть форма со стадией, которая имеет динамическое число групп полей, где число основано на ответах на предыдущем этапе.

Я генерирую поля на стороне сервера в виде массива, т.е.

<input id="foo[0]"...
<input id="bar[0]"...

<input id="foo[1]"...
<input id="bar[1]"...

<input id="foo[2]"...
<input id="bar[2]"... etc

Независимо от номера, все поля обязательны для заполнения, и в некоторых случаях мне также необходимо проверить соответствие типу и количеству цифр. Я использую плагин jQuery validate для обработки на стороне клиента (да, резервное копирование также выполняется на стороне сервера), и проверка не может быть выполнена встроенной, так как форма должна передавать XHTML Strict (EDIT) : см. мое приложение ниже).

Моя проблема в том, что я не могу понять, как использовать валидацию с динамическим числом полей. Вот как обычно выглядит синтаксис проверки для остальной части формы:

$(document).ready(function() {

    // validate stage_form on keyup and submit
    var validator = $("#form_id").validate({

        // rules for field names
        rules: {

            name: "required", 
            address: "required",
            age: { required: true, number: true }

        },

        // inline error messages for fields above
        messages: {

            name: "Please enter your name", 
            address: "Please enter your address",
            age: { required: "Please enter your age", number: "Please enter a number" }

        }

    });

});

Ответы [ 5 ]

13 голосов
/ 06 сентября 2009

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

Markup:

<input id="foo[0]" class="required"
<input id="bar[0]" class="required number"

<input id="foo[1]" class="required"
<input id="bar[1]" class="required email"

JQuery:

$(document).ready(function() {

  var validator = $("#form_id").validate({
    messages: {
            name: "Please enter your name", 
            address: "Please enter your address",
            age: { 
               required: "Please enter your age", 
               number: "Please enter a number" 
            }

    }

  });

});

надеюсь, что это работает. Синан.

2 голосов
/ 04 сентября 2009

Вы пытались использовать пользовательские правила класса для определения несовместимых правил xhtml?

Пример в документах использует только один класс, но я полагаю, что вы можете комбинировать различные пользовательские классы для достижения необходимых вам правил валидации. Я не пробовал это для себя.

0 голосов
/ 20 ноября 2015

Вот еще один способ сделать это.

/* Normal validate initialisation. */
$('#myForm').validate({

    /* Use the submitHandler method to add custom-selector-based validation. */
    submitHandler: function(form, ev) {

        /* Find your dynamic field/s. Note that you may want to access them via a scope external to validate, as any selection you do in this internal scope will be static from the form's pre-edit state. */
        var el = $('#selector');

        /* Do your custom validation. */
        if (  el.val() !== 'A'  ) {

            /* Show any errors:- 'fieldname': 'error message'. */
            this.showErrors({
                'name-of-a-field-near-where-you-want-your-error-placed': 'Please enter "A" to continue'
            });

            /* Prevent form submission. */
            return;
        } 
    }
});
0 голосов
/ 15 августа 2011

Я нашел способ использовать "метаданные".

Это следует использовать внутри шаблона с динамическим именем. Так что мне не нужно знать имя.

Недостатком по-прежнему является невозможность использования кода с чистым javascript с чистыми тегами.

<script src="jquery.metadata.js" type="text/javascript"></script>

<input validate="{required: true, email: true, messages: { required: 'i'm required', 'i'm not valid e-mail' }}" name="dynamicRow[  myRandomNumber ]"type="text" class="input_normal" />

 $( function() {
     // setup stuff
     $.metadata.setType("attr", "validate"); 
});
0 голосов
/ 29 июня 2009

Ответов нет, поэтому я опубликую свое «промежуточное» решение, которое состоит в том, чтобы установить встроенные правила проверки для «required» и «type», оставив «maxlength» для проверки на стороне сервера, а затем отобразить пользовательские сообщения со встроенным заголовком тег.

Вероятно, этого достаточно для выполнения этой работы, но мне все еще любопытно, есть ли способ сделать это "полностью" в jQuery.

...