2009-08-27 5 views
1

Ich habe mehrere Formulare (Benutzer kann neues Formular dynamisch hinzufügen) auf einer Seite, sie sind alle an der gleichen Struts2 Aktion eingereicht. Ich muss alle diese Formulare senden, wenn der Benutzer auf die Schaltfläche Speichern klickt.

Dinge gehen gut in FF. Aber in IE und Google Chrome wird nur das letzte Formular gesendet.Multi-Forms Einreichung in IE und Google Chrome

Jede Hilfe wird geschätzt. Vielen Dank.

Die Elemente jeder Form sind die gleichen, eine Form ein Objekt. Die Daten eines jeden Formulars werden zu einem Domänenobjekt hinzugefügt, dann wird das Objekt in der Datenbank beibehalten.

JavaScript-Funktion zu handhaben Betrieb sparen:

<script type="text/javascript" > 
    function submit() { 
     var formCnt = document.getElementById('formCnt').value; 
     for(var i = 1; i <= formCnt; i++) { 
      var formName = 'form' + i; 
      document.forms[formName].submit(); 
     } 
    } 
</script> 
... 
<input type="hidden" id="formCnt" name="formCnt" value="5" /> 

<form action="add.htm" name="form1" id="form1" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

<form action="add.htm" name="form2" id="form2" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 

<form action="add.htm" name="form5" id="form5" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 
+0

Durch "es funktioniert in FF" Ich nehme an, Sie meinen, dass die Daten in der Datenbank gespeichert werden? Sie erhalten nicht alle Inhalte aus allen Formularen gleichzeitig in derselben Struts-Aktion, oder? – deceze

+0

Es gibt nur eine Struts-Aktion namens AddAction, Formulare auf der Seite werden alle an AddAction übergeben. Also kann ich nicht verschiedene Feldnamen in der JSP-Seite verwenden, wie Sie in der obigen HTML-Quelle sehen können. Ich denke daran, asynchrone Übermittlung mit XHR zu versuchen. Hoffe das würde funktionieren. Vielen Dank für Ihre ausführliche Antwort. – user163970

+0

Sie haben keine Kontrolle über das serverseitige Skript? BTW, vote und accept buttons sind die bevorzugte Art, Danke zu sagen. : o) – deceze

Antwort

0

Sie nur in der Lage sein sollten, eine Form zu einem Zeitpunkt, zu unterbreiten. Ein Absenden-Button muss innerhalb <form> Tags sein, und nur das Formular, dass der Absenden-Button ist, sollte eingereicht werden. Das versteckte input Tag sollte auch in einem Formular-Tag sein, auch BTW.

Auch wenn es über JS geschieht, initiiert eine submit() eine neue POST Anfrage an den Server. Sie können jeweils nur eine Anfrage stellen, deshalb erscheint nur die letzte. Ich habe keine Ahnung, warum es in FF funktionieren würde.

Wenn Sie sowieso alles auf einmal einreichen müssen, warum sollten Sie es zunächst auflösen? Wenn Sie "Unterabschnitte" in einem Formular möchten, können Sie die <fieldset> Tags verwenden.

bearbeiten

Was passiert, wenn Sie Ihr Skript ausführen ist das gleiche, als ob alle Ihre Formulare haben eine Absenden-Button, und klicken, um alle Tasten in schneller Reihenfolge einreicht. Durch Klicken auf eine Senden-Schaltfläche werden die Daten dieses Formulars in einer Anforderung POST an den Server gesendet und die Seite aktualisiert. Wenn Sie schnell genug sind, um auf eine andere Schaltfläche zu klicken, bevor die Seite aktualisiert wird, können Sie ein anderes Formular senden. Die alte Anforderung wird dann abgebrochen.

Der einzige Weg, ich kann mir vorstellen, wie die Daten aller Formulare möglicherweise auf den Server gelangen, wie Sie es tun, wenn die Anfrage gesendet wird, bevor die nächste submit() ausgelöst wird. Im Wesentlichen verlassen Sie sich darauf, dass der Browser langsam ist oder dass Sie die Anfrage zumindest behandeln, bevor Sie die Skriptausführung fortsetzen. Scheinbar funktioniert das in FF, scheitert aber bei anderen Browsern. So wie es sollte.

Edit 2

Wenn Sie mehrere Felder, die mit dem gleichen Namen einreichen müssen, verwenden Sie eine Form und Ihre Felder eindeutige Namen geben. Das beste Benennungsschema hängt davon ab, wie Ihr Backend Formulareinreichungen verarbeitet.

  • item0, item1
  • item.0, item.1
  • Model.0.item, Model.1.item
0

Ich glaube, du bist nur gerade einer nach dem anderen zu unterwerfen erlaubt - das ist eine schlechte Praxis sein könnte, aber wie Im Grunde Duplizieren jedes Formularcodes und Replizieren in einem iframe, Senden des Formulars dort, entweder das oder Verlass auf XHR ($ .post), um nachzuahmen, was die Formulare tun würden.

0

versuchen Sie stattdessen document.getElementById(formId).submit();. Die Methoden document.form.x, document.forms [int], document.forms [id] und document.x für den Zugriff auf Formulare sind keine browserübergreifenden kompatiblen Methoden zum Verweisen auf ein Formular.

Auch - ich glaube, ich hatte einmal ein Problem, als ich sowohl einen Namen und eine ID auf meinem Formular hatte. Die beste Praxis ist die ID, die ich glaube.

+0

Versuchte getElementById, immer noch nicht funktioniert. Ich bin für die Ajax-Lösung, danke. – user163970

Verwandte Themen