1

1 つのページに複数のフォーム (ユーザーは新しいフォームを動的に追加できます) があり、それらはすべて同じ struts2 アクションに送信されます。ユーザーが保存ボタンをクリックしたときに、これらすべてのフォームを送信する必要があります。

FFではうまくいきます。しかし、IE と Google chrome では、最後のフォームのみが送信されます。

どんな助けでも大歓迎です。ありがとうございました。

各フォームの要素は同じで、1 つのフォームが 1 つのオブジェクトです。すべてのフォームのデータはドメイン オブジェクトに追加され、オブジェクトは DB に永続化されます。

保存操作を処理する JavaScript 関数:

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

   ...
4

3 に答える 3

0

document.getElementById(formId).submit();代わりに使用してみてください。フォームにアクセスする document.form.x、document.forms[int]、document.forms[id]、および document.x メソッドは、フォームを参照するクロスブラウザー互換の方法ではありません。

また、フォームに名前とIDの両方があるときに問題が発生したことがあると思います。ベストプラクティスは、私が信じている id を使用することです。

于 2009-08-27T06:02:42.917 に答える
0

一度に送信できるフォームは 1 つだけです。送信ボタンは<form>タグ内にある必要があり、送信ボタンがあるフォームのみを送信する必要があります。その隠しinputタグは、フォームタグ内にもあるはずです。

JS経由で行う場合でも、サーバーへのsubmit()新しいPOSTリクエストを開始します。一度に作成できるリクエストは 1 つだけです。そのため、最後のリクエストのみが表示されます。なぜFFで使えるのかわからない。

いずれにせよ一度にすべてを提出する必要がある場合、最初から分割する必要はありません。フォームに「サブセクション」が必要な場合は、<fieldset>タグを使用できます。

編集

スクリプトを実行すると、すべてのフォームに送信ボタンがあり、すべての送信ボタンをすばやくクリックした場合と同じことが起こります。1 つの送信ボタンをクリックすると、そのフォームのデータがPOSTリクエストでサーバーに送信され、ページが更新されます。ページが更新される前に別のボタンをクリックするのに十分な速さがある場合は、別のフォームを送信できます。古いリクエストはキャンセルされます。

すべてのフォームのデータがどのようにサーバーに到達するかを想像できる唯一の方法は、次のリクエストがsubmit()トリガーされる前にリクエストが送信された場合です。基本的に、ブラウザが遅いか、スクリプトの実行を続行する前に少なくともリクエストを処理することに依存しています。どうやらそれは FF では機能しますが、他のブラウザーでは失敗します。当然のことです。

編集 2

同じ名前の複数のフィールドを送信する必要がある場合は、1 つのフォームを使用して、フィールドに一意の名前を付けます。最適な命名スキームは、バックエンドがフォーム送信を処理する方法によって異なります。

  • item0item1
  • item.0item.1
  • Model.0.itemModel.1.item
于 2009-08-27T05:29:45.947 に答える
0

一度に送信できるのは1つだけだと思います-これは悪い習慣かもしれませんが、基本的に各フォームコードを複製してiframeに複製し、そこにフォームを送信するか、XHR( $. post ) フォームが何をするかを模倣します。

于 2009-08-27T05:32:15.007 に答える