2010-08-01 59 views
2

我在想什麼是用jQuery處理AJAX調用的最佳方法?現在我正在做類似如下:jQuery AJAX調用,如何處理

$("#test").live('click', function(){ 
    // Process form 
    $.ajax({ 
     type: "post", 
     url: "test.php", 
     success: function(html){ 
      if(html.success == 0) { 
       alert('Error'); 
      } else { 
       var obj = $.parseJSON(html.rows); 
       $("#success").html(obj[0].name); 
      } 
     }, 
     dataType:'json' 
    }); 
    return false; 
}); 

在test.php文件中,我檢查請求是否是AJAX請求。如果它是一個AJAX請求我運行一個數據庫查詢得到一些數據(這部分是不是在這個問題很重要,我認爲):

// query goes here 
if(mysql_num_rows($query) > 0) { 
    $result['success'] = 1; 
    $result['data'] = json_encode($data); 
} else { 
    $result['success'] = 0; 
} 

現在我想知道如果我的方法可能是最好的?僅供參考我目前使用KohanaPHP框架,所以我不想打破MVC「規則」。如果我做錯了,你有任何提示和建議如何處理控制器中的AJAX調用?

問候, 湯姆

回答

1

你有什麼好看在這裏,雖然我不認爲你需要一個$.parseJSON()那裏,它應該已經是在這一點上的對象,這應該工作:

$("#success").html(html.rows[0].name); 

作爲一個方面說明,從可讀性/可維護性的角度來看,我會重命名html說法是data,就像這樣:

success: function(data) { 

這是純粹的偏好設置,但是當它是HTML類型的響應時使用html,或者當它是JSON時,使用data或其他內容,因爲您期待的對象可以讓外界更容易閱讀。

+0

謝謝您的回答尼克。我很高興聽到我正確地做了這件事,花了幾個小時閱讀jQuery手冊。 BTW ...我想知道同樣的方式關於一個對象,但是當我嘗試'$(「#success」)。html(html.rows [0] .name);'在它不工作之前。想知道爲什麼? – Tom 2010-08-01 13:27:28

+0

@Tom - 如果你的console.log(html.rows)'你在控制檯(Firebug/Chrome)中獲得了什麼?它仍然是一個字符串或對象? – 2010-08-01 13:30:07

+0

@Nick - 由於未知原因,它是一個字符串。 – Tom 2010-08-01 13:35:30

0

@湯姆 - 你需要的PHP陣列編碼是這樣的:

$data = array(
    'status' => 'success' 
); 

echo json_encode($data); 

但你可能要改變陣列結構一點點。由於XHR對象具有文本狀態我通常編碼JSON數組是這樣的:

$response = array(
    'status' => 'success' // or flash or error 
    ,'flash' => array(
        'header' => 'whatever is wrong with submission of data html list format' 
        'fields' => array('field names to be highlighted') 
        ) 

    ,'html' => 'html presentation' 
    ,'data => array('json data') 
); 

echo json_encode($response); 

現在你可以做一些很好的事情是這樣的:

  ,success: function(response) { 
       if (response.status === 'success') { 
        $('.basic_container').hide(); 
        that.removeDataTable(); 
        that.getContent(contentUrl); 
        $('.basic_container').show(); 
       } 
       if (response.status === 'flash') { 
        $('#flash').html(response.flash.header); 
        $('#flash').show(); 
        that.highlightWithFlash(response.flash.fields); 
       } 
      }