2010-09-02 10 views
6

Mam formularz, który jest dynamicznie tworzony przy użyciu ajax (ponieważ dane dla elementów formularza musi pochodzić z bazy danych) i chcę serializować elementy formularza do przesłania przez ajax. Obecnie jestem po prostu testuje moją teorię za pomocą kodu ze strony jQuery po prostu zobaczyć, czy mogę odebrać elementów formularza i to, gdzie leży problem:jQuery serializeArray nie zbiera dynamicznie utworzonych elementów formularza

$(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 

    }); 
}); 

muszę dokonać pewnych zmian w danych przed do przesłania, a ten kod nie jest jeszcze napisany, ale znajduję to, że wszelkie elementy wejściowe na stronie, które istniały w czasie ładowania strony, są pobierane poprawnie, wszystkie elementy, które są zapełniane przy użyciu Javascript, są pobierane poprawnie, ale wszelkie utworzone przy użyciu ajax są ignorowane.

Wiem, że jest to normalnie rozwiązane przy użyciu "na żywo", ale nie jestem jasne, jak rozwiązać ten problem z serializeArray(). Korzystanie z dodatkowych elementów formularza Ajax jest dodawane do #customSearchTable i nie są one pobierane.

Każda pomoc bardzo ceniona.

Dzięki

+1

Ta metoda nie obchodzi, kiedy elementy zostały dodane, wydaje się, że nie są one poprawnie dodawane jako elementy formularza, czy możesz opublikować ten kod? Na przykład czy mają na nich atrybut 'name'? –

+0

Nick, dzięki bardzo, masz rację, dynamicznie generowane elementy formularzy nie miały atrybutu nazwy .... DOH !!! Dzięki wielkie!! – Cydaps

Odpowiedz

7

będę wykładać po komentarzu nieco więcej tutaj:

Po wywołaniu .serializeArray() to krążący po prostu jako składania <form> będzie albo tak blisko, jak to możliwe i tak, aby elementy, które należy przedłożyć. Część klucz is here:

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

Podobnie jak <form> złożyć nie zawierają elementy bez name attribute, wywołanie .filter() użyciu this.name filtruje te elementy Spośród tych, które mają być w odcinkach.

+0

Dzięki Nick, mam nadzieję, że wyjaśni to dla każdego, kto ma ten sam problem. – Cydaps

+0

dostał poprawkę dla '