2010-09-18 34 views
61

Làm thế nào tôi có thể xác định kiểu trả lời của cuộc gọi ajax trong Jquery? Đôi khi, máy chủ gửi phản hồi json và đôi khi nó chỉ gửi html cho mục đích hiển thị. Ngay bây giờ tôi đang sử dụngjquery cách kiểm tra kiểu trả lời cho cuộc gọi ajax

if(response.indexOf('Error')) 
    //popup error message 
else 
response.username 
response.address 
+1

Bạn có thể kiểm tra thông qua "typeof response ==" object "' – Imdad

+0

Bạn đã thử xem loại MIME của phản hồi? – Dick

Trả lời

106

Bạn có thể thử nó thích:

$.ajax({ 
    type: "POST", 
    url: "your url goes here", 
    data: "data to be sent", 
    success: function(response, status, xhr){ 
    var ct = xhr.getResponseHeader("content-type") || ""; 
    if (ct.indexOf('html') > -1) { 
     //do something 
    } 
    if (ct.indexOf('json') > -1) { 
     // handle json here 
    } 
    } 
}); 

Về cơ bản nó cũng được sử dụng indexOf nhưng có vẻ như đáng tin cậy hơn.

+0

BTW Tôi khuyên bạn chỉ nên sử dụng một định dạng nếu có thể. Giống như ngay cả khi bạn đang hiển thị một số thông điệp đơn giản, bạn cũng có thể sử dụng json. –

+0

Cảm ơn rất nhiều. Đây là chính xác những gì tôi đang tìm kiếm hoặc tôi muốn jquery có aa phím tắt cho điều này :) – sam

+0

Cảm ơn vì điều này ... nên đã nhận ra chúng ta có thể nhìn vào các tiêu đề;) –

0

Để chấp nhận trả lời JSON, bạn có thể đặt loại trả lời là JSON. Tôi thường thiết kế mã phía máy chủ của mình để chúng luôn trả về trả lời JSON. Trong trường hợp nó không làm như vậy vì lý do gì, tôi sẽ nhận được một lỗi trong cuộc gọi AJAX của tôi cho có định dạng JSON không chính xác và tôi có thể xử lý trả lời từ máy chủ không phải là không JSON.

error: function(response, status, xhr){ 
// do something with the reply. 
} 
+0

Điều đó không làm lộn xộn quá trình xử lý lỗi? Ruột của tôi nói nó là hackish ... –

+0

off-khóa Tôi có thể yêu cầu máy chủ của tôi trả về một lỗi logic được định dạng là JSON, nhưng khi máy chủ của bạn bị hỏng hoặc bị hỏng, bạn sẽ không nhận được một cơ thể json. – Ivan

8

Những câu trả lời trên didnt làm việc cho tôi vì vậy tôi đã đưa ra giải pháp này:

success: function(data, textStatus , xhr) { 
if(xhr.responseXML.contentType == "text/html") { 
    //do something with html 
    } 
else if(xhr.responseXML.contentType == "application/json") { 
    //do something with json 
    }} 
+0

Điều này có thể sẽ không hoạt động nếu loại nội dung là ví dụ "text/html; charset = UTF-8" – Steven

14

Bạn chỉ có thể sử dụng phương pháp dễ dàng javascript để kiểm tra các loại

tức

if(typeof response=="object") 
{ 
// Response is javascript object 
} 
else 
{ 
// Response is HTML 
} 

Nếu bạn sử dụng phương pháp này, bạn không phải viết thêm 2 tham số trong cuộc gọi lại thành công.

+0

Đây là một chút hack, nhưng nó là giải pháp đơn giản nhất. –

6

Nếu phản hồi được phân tích cú pháp dưới dạng JSON, đối tượng jqXHR sẽ có thuộc tính responseJSON.

$.ajax(
    // ... 
).done(function(data, textStatus, jqXHR) { 
    if (jqXHR.responseJSON) { 
     // handle JSON 
    } else { 
     // handle html 
    } 
}).fail(function(jqXHR, textStatus, errorThrown) { 
    if (jqXHR.responseJSON) { 
     // handle JSON 
    else { 
     // handle html 
    } 
}) 

Từ jQuery.ajax documentation:

Nếu json được chỉ định, đáp ứng được phân tách bằng jQuery.parseJSON trước khi được thông qua, như là một đối tượng, để xử lý thành công. Đối tượng JSON được phân tích cú pháp được tạo sẵn thông qua thuộc tính responseJSON của đối tượng jqXHR.

+0

Điều này không chính xác vì phản hồi "hydrat hóa" dựa trên định dạng bạn đã yêu cầu. Tôi đã thử nghiệm một cuộc gọi như '$ .ajax ({.., dataType: 'html'})' và từ phía máy chủ, tôi gửi phản hồi 'application/json', nhưng jQuery không điền vào trường jqXHR.responseJSON. –

+0

Thật vậy, nhưng OP muốn biết loại phản hồi.Tại sao bạn chỉ định 'dataType: 'html'' nếu bạn biết máy chủ sẽ không gửi' html '? Có thể chỉ định 'dataType' buộc jQuery sử dụng kiểu dữ liệu đó, bỏ qua tự động phát hiện. – tyrion

+0

Có thể, nhưng trong trường hợp của tôi, nếu tôi không chỉ định yêu cầu 'html', symfony sẽ trả về biểu mẫu trong JSON mà tôi không muốn. Tình huống cụ thể thực sự. –

Các vấn đề liên quan