2012-04-11 17 views
1

Ich habe mehrere <form> auf einer einzigen Seite, alle mit eindeutigen IDs, und der Formularkörper ist etwas wie unten.

<form id="form-main"> 
    <table> 
     <tr> 
      <td><input type="text" name="field1"/></td> 
       . . . . . . . 
       . . . . . . . 
     </tr> 
    </table> 
    <table> 
     <tr> 
      <td><input type="text" name="field2"/></td> 
       . . . . . . . 
       . . . . . . . 
     </tr> 
    </table>  
</form> 

<form id="form-second"> 
    <table> 
     <tr> 
      <td><input type="text" name="field3"/></td> 
       . . . . . . . 
       . . . . . . . 
     </tr> 
    </table> 
    <table> 
     <tr> 
      <td><input type="text" name="field4"/></td> 
       . . . . . . . 
       . . . . . . . 
     </tr> 
    </table> 
</form> 

Ich weiß es nicht Tabellen empfohlen zu verwenden, um Formularfelder ausgerichtet zu haben, und man kann mit CSS dies zu tun, aber eigentliche Problem ist, dass, wenn ich $("#form-main").serializeArray verwenden, sollte ich alle Felder des Formulars erhalten sie in meinem Array-Objekt, aber hier bekomme ich nur Felder der ersten Tabelle innerhalb des Formulars, Rest der Eingaben werden einfach ignoriert.

Ist dies ein gültiges Verhalten von serializeArray()? oder meine Verwendung von Tabellen ist das eigentliche Problem? Ich kann anstelle von Tabellen div s verwenden, aber das wäre meine letzte Option. In diesen mehreren Formularen enthält die erste Tabelle Felder, die ausgefüllt werden müssen. Daher überarbeite ich mit dem Ansatz "Validierung als-du-Typ" diese Pflichtfelder, um zu prüfen, ob sie nicht leer bleiben Dies ist ein Grund, warum nur die erste Tabelle jedes Formulars im Array-Objekt enthalten ist.

+3

'Ich weiß, dass es nicht empfohlen wird, Tabellen zu verwenden, um ausgerichtete Formularfelder zu haben ... seit wann? Sicheres CSS funktioniert, aber manchmal ist Einfachheit der Schlüssel. Lass die "Tisch-Hasser" dich nicht erwischen. Nichts ist falsch mit einem gut geformten Tisch. – SpYk3HH

+1

Sind alle Felder in der 2. Tabelle mit dem Attribut 'name' identisch, wie in der ersten Tabelle? –

+2

2 Dinge zu prüfen, für BTW, 1) ist Ihr Formular vollständig Umbruch Tabelle, 2) Haben alle Eingaben, wählt, und Textboxen haben eine 'name' Attribut? – SpYk3HH

Antwort

2

Dies ist eine vollkommen gültige Verwendung von serializeArray und es sollte mit mehreren Elementen mit dem gleichen Namen auch funktionieren. Ich habe gerade einen Schnelltest gemacht (http://jsfiddle.net/Q5s5V/) und alles hat sich wie erwartet verhalten ... Ich denke, da ist etwas anderes in deinem Code falsch.

Eine Sache, die Sie versuchen könnten, wählt die Eingänge selbst anstelle der Form und sehen 1) haben Sie alle Eingänge, die Sie erwarten und 2) macht diese Sammlung ordnungsgemäß serialisieren.

var $elements = $('#form-main :input'); 
console.log($elements.length); 
console.log($elements.serializeArray()); 

Meine Vermutung ist, dass ein Markup-Fehler (nicht geschlossenes Tag oder was auch immer) verhindert, dass diese Elemente ausgewählt werden.

+0

Ich weiß nicht, was ich verpasste, aber das Problem ist gelöst, wenn ich den JS-Code, der '$ .merge()' d alle Array-Objekte von einzelnen Formen in einzelnes Objekt und die Konvertierung wieder in JSON für das Senden über '$ .ajax()'. Vielen Dank.... – Kushal

+0

Ich bin vor hier gleiche Problem, aber in meiner Situation etwas wie ::

(Eigentlich In den letzten zwei Elemente, die ich den Wert mit Hilfe von JavaScript eingestellt (einige Funktionen) Ich bin nicht nützt das vom Benutzer. Ist das das Problem ?? –

+0

@ShyamDixit, Ihr Problem ist die Struktur Ihres html auch. Sie können das erste div nicht schließen, bevor Sie das Formular schließen. Bewegen Sie das öffnende Formularumbauzeichen außerhalb dieses äußeren div Sie Sie bin in Ordnung. '

' – Prestaul

0

Ich weiß, das ist eine alte Frage, aber ich war überrascht, die richtige Antwort hier nicht zu sehen. Das Problem ist, dass Sie zwei Formulare auf der Seite haben, nicht eins.

serializeArray() funktioniert nur mit Feldern innerhalb des von Ihnen angegebenen Formular-Tags, also mit $ ("# form-main"). SerializeArray enthält nur field1 und field2.

Feld3 und Feld4 sind nicht enthalten, da sie nicht in # Form-Haupt sind, sie sind in # Form-Sekunde.