3

onClickフォームを複数回送信し、複数選択フィールドで選択した項目を繰り返し、それぞれに1回送信するイベント を作成したいと思います。

ループをコーディングするにはどうすればよいですか?

私はRubyonRailsで作業してremote_function()おり、ajax呼び出し用のJavaScriptを生成するために使用しています。

4

3 に答える 3

5

私の簡単な答えは(まだコーディングしていないので)、XMLHTTPRequestと単一の呼び出しの特定のパラメーターを使用してPOSTを作成する別の関数を作成することです。次に、onClick()ハンドラー内で、選択したアイテムをループしながらその関数を呼び出します。

ダミーのHTMLページとjavascriptを使用して概念実証を行い、それをRoRで機能させる方法を理解することをお勧めします。

また、RoRコントローラーでループ状態を処理するのではなく、ブラウザーから複数の呼び出しを行おうとしているのはなぜですか?

于 2008-09-14T14:43:44.203 に答える
2

いくつかの JavaScript を手動で作成する必要があります。Rails のジェネレーターは、これほど複雑なことは行いません。

ただし、Prototype.js はほとんどすべての面倒な作業を行います。私の頭の上から、コードは次のようになります: (未テスト)

<%= javascript_include_tag 'prototype' %>

<form id="my-form">
  <input type="text" name="username" />

  <select multiple="true" id="select-box">
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
    <option value="4">Fourth</option>
  </select>
</form>

<script type="text/javascript" language="javascript">
submitFormMultipleTimes = function() {
  $F('select-box').each(function(selectedItemValue){
    new Ajax.Request('/somewhere?val='+selectedItemValue, 
      {method: 'POST', postBody: Form.serialize('my-form')});
  });
}
</script>

<a href="#" onclick="submitFormMultipleTimes(); return false;">Clicky Clicky</a>

ノート:

  • プロトタイプの$F()メソッドを使用して、選択したアイテムの値を取得します。複数選択ボックスの配列を返します

  • を使用Ajax.Requestして、データを としてサーバーに送信しますPOST
    サーバーにとって、これは通常のフォームを送信するのとまったく同じに見えます

  • Form.serializeフォームからデータを取得し、リクエストの本文に貼り付けるために使用します。
    これは、通常どおりにフォームを送信した場合に送信されるデータとまったく同じです。

于 2008-09-14T21:06:36.687 に答える
1

ブラウザーの DOM を変更しない限り、これを行う理由は思い浮かびません。(しかし、あなたが何をしようとしているのかを完全に知らなければ、この場合は間違っている可能性があります =)

複数のオブジェクト (フォーム内のネストされた複雑なオブジェクトであっても) からデータを 1 回の POST で送り返すことができるはずです。

おそらく、Rails のコードは、あなたが思いついたどの JavaScript よりもはるかに単純で、書きやすく (そしてデバッグも簡単です!) なるでしょう。

ユーザーが選択した内容に応じてページのさまざまな部分を更新する必要がある場合でも、render :update ブロックで RJS を介して DOM に複数の更新を行うことができるため、問題にはなりません。

また、複数の POSTS を使用する必要がある複数の往復ではなく、1 回のサーバー往復で済むという (大きな) 利点もあります。

于 2008-09-17T01:39:58.727 に答える