2012-11-21 63 views
0

讓我快速解釋我做了什麼,我有多個jQuery AJAX發佈迴應不同的結果。這是我目前在做什麼:從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文件兩次,只是定義了不同的動作。由於我有幾個其他的文章(約6),我想知道是否有其他方式來做到這一點?

我希望你們能理解我的問題。我期待着您的意見。

+0

除了把它放在一個函數,它將'data'和'success'作爲參數,你在做什麼沒有錯。如果需要6個電話,則需要6個電話。如果這是你要定期做的事情,那麼從一次通話中返回所有數據可能是有意義的,但是如果不知道更多情況,很難說這是否值得做。 – Archer

+0

我認爲最好的解決方案是將你的$ .ajax調用包裝在一個函數中。然後將您的操作中更改的值作爲參數傳遞。 這是你想要做的嗎? –

+0

我在後臺做什麼取決於不同的PHP方法正在運行的「操作」,它返回我的結果。如果我做這件事的方式沒有問題,我很好。我只是想知道,如果有一個「更好」的方式來做到這一點,因爲這是我第一次使用它。 – Crasher

回答

0

一旦你將所有這些要求一個接一個,到同一頁,我認爲這將是更好的做這樣的事情:

$.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對象。

原因:

  • 一個請求,導致較低的負載在服務器上(無需初始化6請求 環境)
  • 快(每個請求需要一些時間來 連接到服務器,也有可能與會話鎖定一個問題:一旦你使用默認的會話的所有請求將被用於一個 由 一個,等待previouse請求完成)

基本思想是通過一個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); 
+0

感謝您的回覆,不確定您是否正確,或者我只是不理解它:-)在變更事件中,我總是必須處理所有這些請求。而且我也沒有看到如何處理PHP部分,因爲我從來沒有做過類似的事情......但是我認爲我的描述至少有一個起點,謝謝。 – Crasher

+0

@Crasher PHP部分可以類似於JS部分進行處理(請參見'成功'處理程序中的開關)。只需循環遍歷$ _POST ['actions']中的項目並使用操作名稱來決定要執行的操作。輸出結果到一些變量,而不是立即回到客戶端。 –

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); 
} 

非常感謝爲止!

+0

檢查我的答案,保持幾乎相同的邏輯後,但以一個更簡潔和有組織的方式http://stackoverflow.com/a/13549732/647380 – pocesar

0

你可以使用一個庫來自動爲你做,甚至當它完成時鏈接AJAX響應,但是不用客戶端,你可以從服務器端調用ajax函數。使用phery庫(http://phery-php-ajax.net),你可以做到這一切從服務器:在你antragsformulare_benutzer.inc.php文件

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

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(); 

正如你所看到的,您可以撥打第二個AJAX響應,或合併這兩個答案,我認爲這是對你最好的選擇,並保存一個AJAX呼叫;)