0

私が何をしているのかを簡単に説明しましょう。異なる結果を返す複数の jQuery AJAX 投稿があります。現時点で私がやっていることは次のとおりです。

JavaScript

$("select#be_betrieb")
  .change(function() {

    $.ajax({
      type: "POST",
      url: "/functions/antragsformulare_benutzer.inc.php",
      data: { action: "getkst", bkuerzel: $(this).val() },
      success: function(data) {
        $("select#be_kostenstelle").attr('disabled',false);             
        $("select#be_kostenstelle").html(data);
      }
    });

    $.ajax({
      type: "POST",
      url: "/functions/antragsformulare_benutzer.inc.php",
      data: { action: "getcompnames", bkuerzel: $("select#be_betrieb").val() },
      success: function(data) {             
        $("select#be_arbeitsplatzbestehend").html(data);
      }
    });
  });

ご覧のとおり、別のアクションを定義して、同じ PHP ファイルに 2 回投稿しています。このファイルには他にもいくつかの投稿があるので (約 6)、それを行う他の方法があるかどうか疑問に思っていました。

皆さんが私の質問を理解してくれることを願っています。皆様のご意見をお待ちしております。

4

3 に答える 3

1

あなたの入力に基づいてコードを変更しました。

Javascript

$("select#be_betrieb")
        .change(function() {

            $.ajax({
                type: "POST",
                url: "/functions/antragsformulare_benutzer.inc.php",
                dataType: "json",
                data: 
                    { 
                        actions: [
                                    {action: "getkst", bkuerzel: $(this).val()},
                                    {action: "getcompnames", bkuerzel: $(this).val()}
                                 ]
                    },
                success: function(data)
                    {
                        for (var i = 0; i<data.length; i++)
                        {
                            switch(data[i]["action"])
                            {
                                case "getkst":
                                    alert(data[i]["queryresult"]);
                                    break;

                                case "getcompnames":
                                    alert(data[i]["queryresult"]);
                                    break;
                            }
                        }
                    }
            });

PHP

if ( $_POST['actions'] != "" )
{
foreach ($_POST['actions'] as $action)
{
    switch ($action['action'])
    {
        case "getkst":

            $queryresult = "here something to return";

            $results[] = array('action' => 'getkst', 'queryresult' => $queryresult);
            break;

        case "getcompnames":

            $queryresult = "here something to return";

            $results[] = array('action' => 'getcompnames', 'queryresult' => $queryresult);
            break;
    }
}

echo json_encode($results);
}

これまでありがとうございました!

于 2012-11-22T08:43:47.113 に答える
0

これらすべてのリクエストを1つずつ同じページに送信したら、次のようなことを行う方がよいと思います。

$.ajax({
      type: "POST",
      url: "/functions/antragsformulare_benutzer.inc.php",
      dataType:'json',
      data: {actions: [{action: "getkst", bkuerzel: $(this).val()},
                       {action: "getcompnames", bkuerzel: $("select#be_betrieb").val()},
                       ...] },
      success: function(data) {
        for(var i = 0;i<data.length;i++) {
            switch(data[i]["action"]) {
                case "getkst":
                    $("select#be_kostenstelle").attr('disabled',false);             
                    $("select#be_kostenstelle").html(data[i].resultHTML);
                    break;
                case "getcompnames":
                    $("select#be_arbeitsplatzbestehend").html(data[i].resultHTML);
                    break;
            }
        }
      }
    });

そして、で/functions/antragsformulare_benutzer.inc.phpエンコードされた結果の戻り配列json_encode

dataType:'json'これにより、jQueryはJSONのように応答を処理する必要があることを通知されるため、データには通常のJSオブジェクトが含まれます。

理由:

  • サーバーの負荷を下げる1つのリクエスト(6つのリクエストのために環境を初期化する必要はありません)
  • より高速(各リクエストはサーバーに接続するのに時間がかかります。また、セッションロックに問題がある可能性があります。デフォルトのセッションを使用すると、すべてのリクエストが1つずつ使用され、前のリクエストが終了するのを待ちます)

基本的な考え方は、1つのAJAXリクエストですべてのアクションとその値をプッシュすることです。サーバー上では$_POST['actions']、各アクションに必要なものを繰り返し実行します。次のように結果をPHP配列に収集します。

 $results = array(array("action" => 'action1', 
                        "results" => "some action results"), 
                  array("action" => 'action2', 
                        "results" => "some action results"),
                  ...);

そして、その配列をjson_encodeでエンコードするので、jQueryはそれを解析できます。

echo json_encode($results);
于 2012-11-21T14:38:20.737 に答える
0

それを自動的に行うライブラリを使用して、完了時に AJAX 応答をチェーンすることもできますが、クライアント側で行う代わりに、サーバー側から ajax 関数を呼び出します。phery ライブラリ ( http://phery-php-ajax.net ) を使用すると、サーバーからすべて実行できます。

<select data-remote="getkst" name="bkuerzel" data-target="/functions/antragsformulare_benutzer.inc.php">
   // fill your options here
</select>

あなたのantragsformulare_benutzer.inc.phpファイルに

function getcompnames($data){
  $r = new PheryResponse;  
  // get your comp names here. If you are appending to a select, use
  $r->jquery('select#be_arbeitsplatzbestehend')->html($html_content);
  return $r;
}

function getkst($data){
  $r = new PheryResponse; 
  $html_content = set_your_html_content();

  $r
  ->jquery('select#select#be_kostenstelle')
  ->removeAttr('disabled')->html($html_content);
  // you could do
  // $r->phery_remote('getcompnames', array('bkuerzel' => $data['bkuerzel']), array('target' => '/functions/antragsformulare_benutzer.inc.php'));
  // to call a second ajax when this one is completed, but it's best to merge the response from getcompnames and keep it all in one single AJAX call
  return $r->merge(getcompnames());
}

Phery::instance()->set(array(
  'getkst' => 'getkst',
  'getcompnames' => 'getcompnames'
))->process();

ご覧のとおり、2 番目の AJAX 応答を呼び出すか、両方の回答をマージして、1 つの AJAX 呼び出しを保存するのが最善の策だと思います;)

于 2012-11-25T09:21:56.240 に答える