2012-04-16 217 views
5

我有一個表單,通過jQuery .ajax() POST提交給服務器。如果表單在服務器端傳遞了驗證,則服務器將返回HTML結果以供客戶端相應地更新其表示。但是,如果表單未通過驗證,則服務器將返回JSON結果,其中包含驗證錯誤。

這兩種類型的結果都會在處理程序.ajax()中結束。由於這兩種類型都是可能的,處理程序需要一種方法來確定結果是HTML還是JSON。我怎樣才能做到這一點?

注意:表面上,我的問題看起來像this existing SO question一樣,但它們不一樣。在這個問題中,只有一個可能的數據類型(HTML JSON),而我的問題是要找到一種方法來處理兩種可能的數據類型(HTML JSON)。

回答

3

對JSON數據,typeof(data)object。對於html數據,它將是string

至少從ASP.NET MVC3操作返回的數據起作用。我假設它是決定jquery如何處理返回數據的mime類型。

+0

我已經用一些基本的Ajax調用對它進行了測試,它似乎工作得很好。儘管你在答案上打了30秒。 – adeneo 2012-04-16 18:07:18

5

如果你離開dataType參數空白,jQuery將決定此基礎上的MIME類型:

dataTypeString

默認:智能猜測(XML,JSON,腳本或HTML)

您期望從服務器返回的數據類型。如果沒有指定,jQuery將嘗試基於MIME類型的響應來推斷它

裁判:http://api.jquery.com/jQuery.ajax/

+0

我的問題是,我有兩個不同的代碼塊來執行,這取決於返回的數據所在的數據類型。'success'處理程序有一個'if'語句來確定要執行哪個代碼塊,但是我不' t知道'if'語句可以用來檢查什麼。 – tamakisquare 2012-04-16 18:09:52

+1

jQuery已經爲你解析了它,所以如果它是JSON,它將是一個有效的Javascript對象,如果它是HTML,它將是一個有效的Javascript對象。 – Paystey 2012-04-16 18:12:26

+1

@ahmoo:正如Paystey所說,你可以使用'typeof(response)'來檢查它是否是一個'object'或者一個返回的字符串。' – Ropstah 2012-04-16 18:18:44

2

如果你是100%肯定,你餵養你的jQuery的數據是乾淨的惡意的XSS攻擊,那麼你可能可以使用JavaScript的eval()方法來獲得優勢。

感謝@SLaksa suggestion換出那個討厭eval()我使用。

可以使用$.parseJSON文本的原始字符串轉換成JSON對象

function ajaxResponse(raw_data){ 
    try{ 
    // eval("var response="+raw_data); // try and avoid this if possible 
    var response = $.parseJSON(raw_data); 
    if (response){ 
     // We have a JSON inside the 'response' variable! 
    } 
    } catch(e){ 
    // We do not have a JSON. 
    // Probably HTML content. 
    // Might be a malformed JSON. 
    } 
} 

正如在代碼中提到,要注意,如果你傳遞一個畸形的JSON對象,然後您的回調將看到這是HTML。

請注意,由$.ajax()調用指定的dataType必須是text,以便jQuery不會嘗試爲您解析它。


我們都喜歡讓我們的生活更輕鬆一些的替代品 - 這裏有一個適合您的情況。
爲什麼不能總是返回一個JSON對象?像這樣的事情也許:

{"err":"","html":"<div>foobar<\/div>"} 

而對於一個錯誤:

{"err":"1","message":"You did not foo all of your bars yet!"} 
+1

不;使用'$ .parseJSON'。 – SLaks 2012-04-16 18:50:44

+0

@sla - 謝謝!事實上,這是更好的選擇。編輯來反映這一點。 – Lix 2012-04-16 19:12:40

2

使用typeof,它會報告你處理的數據類型。

FIDDLE

1

爲什麼不使用JSON返回HTML呢?

我通常做的是建立我返回的JSON對象是這樣的:

{ 
    //s=status, d=data 
    "s":0, //0 means success, other numbers are for different errors 
    "d":{ /* Other JSON object or string here */ } 
} 

所以,你的情況,你會做這樣的事情(僞):

if (StuffIsValid()) { 
    ResponseWrite('{"s":0,"d":"<html>html code here</html>"}'); 
} else { 
    ResponseWrite('{"s":1,"d":{"errlist":["err1","err2"]}}'); 
} 

當然,您希望使用內置的JSON庫作爲您選擇的服務器端語言,而不是使用字符串。

然後,在你的jQuery success回調中,我會檢查s的值。

$.ajax({ 
    url: 'url', 
    dataType: 'json', 
    success: function(data) { 
     if (data) { 
      //We have a JSON object 
      if (data.s === 0) { 
       //Success! 
       //Do stuff with data.d as a string 
      } else if (data.s === 1) { 
       //Failed validation 
       //Do stuff with data.d as an object 
      } else { 
       //How did this happen? 
      } 
     } else { 
      //Uh oh, no object, user must have been logged out (or something) 
     } 
    }); 

這是如果用戶先登錄才能訪問您發佈到,因爲你可以趕上一個事實,即返回的數據不是一個JSON對象的頁面特別有用。

相關問題