jQuery serializeArray не выбирает динамически созданные элементы формы - PullRequest
6 голосов
/ 02 сентября 2010

У меня есть форма, которая динамически создается с использованием ajax (поскольку данные для элементов формы должны поступать из базы данных), и я хочу сериализовать элементы формы для отправки с помощью ajax. В настоящее время я просто проверяю свою теорию, используя код с веб-сайта jQuery, чтобы посмотреть, смогу ли я подобрать элементы формы, и вот в чем проблема:

$(document).ready(function() {
    $('#btnCustomSearch').live('click', function() {
            $('#results').html('');
            alert($('#customSearchTable :input').serializeArray());
            // get all the inputs into an array.
            var fields = $('#customSearchTable :input').serializeArray();
            jQuery.each(fields, function(i, field) {
                $("#results").append(field.name + " = " + field.value + ", ");
            });

            // now we'll reformat the data as we need

            // here we'll send the data via ajax

    });
});

Мне нужно внести некоторые изменения в данные перед отправкой, и этот код еще не написан, но я обнаружил, что любые элементы ввода на странице, которые существовали на момент загрузки страницы, выбраны правильно, любые элементы, которые заполнены с использованием Javascript, правильно подобраны, но все созданные с помощью ajax игнорируются.

Я знаю, что это обычно решается с помощью "live", но мне неясно, как решить эту проблему с помощью serializeArray(). При использовании Ajax к #customSearchTable добавляются дополнительные элементы формы, и они не подобраны.

Любая помощь с благодарностью.

Спасибо

Ответы [ 2 ]

7 голосов
/ 03 сентября 2010

Я поясню комментарий немного подробнее здесь:

Когда вы звоните .serializeArray(), он проходит через все так же, как отправка <form> или как можно ближе к нему в любом случае., чтобы получить элементы для отправки.Ключевая часть здесь :

.filter(function() {
  return this.name && !this.disabled &&
         (this.checked || rselectTextarea.test(this.nodeName) ||
         rinput.test(this.type));
})

Так же, как отправка <form> не будет включать элементы без атрибута name , .filter() вызов с использованием this.name отфильтрует эти элементы из тех, которые будут сериализованы.

0 голосов
/ 02 сентября 2010

Для всех, кто находит это как «проблему», обратите внимание, что согласно приведенному выше комментарию Ника Крейвера, все, что требуется, это убедиться, что атрибут «name» добавлен к новым элементам формы, которые создаются динамически. Это решило мою проблему! Большое спасибо, Ник!

...