2009-05-17 32 views
7

Tôi đang cố gắng tạo một hệ thống trò chuyện nhỏ ajax (chỉ dành cho heck của nó) và tôi đang sử dụng prototype.js để xử lý phần ajax.Nhận json trên lời gọi phản hồi Ajax

Một điều tôi đã đọc trong trợ giúp là nếu bạn trả về dữ liệu json, hàm gọi lại sẽ điền dữ liệu json đó vào tham số thứ hai.

Vì vậy, trong tập tin php của tôi mà được gọi là tôi có:

header('Content-type: application/json'); 

if (($response = $acs_ajch_sql->postmsg($acs_ajch_msg,$acs_ajch_username,$acs_ajch_channel,$acs_ajch_ts_client)) === true) 
    echo json_encode(array('lastid' => $acs_ajch_sql->msgid)); 
else 
    echo json_encode(array('error' => $response)); 

Trên yêu cầu ajax tôi có:

onSuccess: function (response,json) { 
       alert(response.responseText); 
       alert(json);  
      } 

Cảnh báo của response.responseText mang lại cho tôi { "lastid": 8} nhưng json cho tôi null.

Bất kỳ ai biết cách tôi có thể thực hiện công việc này?

Trả lời

22

Đây là cú pháp chính xác để lấy JSON with Prototype

onSuccess: function(response){ 
    var json = response.responseText.evalJSON(); 
} 
+0

Cảm ơn! Nhưng tôi đã đọc ở đâu đó về thông số thứ hai đó: P – AntonioCS

+0

Cảm ơn Jose. Vâng, http://www.prototypejs.org/learn/introduction-to-ajax nó nói rằng param thứ hai là json, crap, wont làm việc cho tôi - onSuccess: function (transport, json) { alert (json? Object. kiểm tra (json): "không có đối tượng JSON"); } – umpirsky

1

Bạn cũng có thể chỉ cần bỏ khung. Đây là một cách qua trình duyệt tương thích để làm ajax, được sử dụng trong một widget nhận xét:

 
//fetches comments from the server 
CommentWidget.prototype.getComments = function() { 
    var commentURL = this.getCommentsURL + this.obj.type + '/' + this.obj.id; 
    this.asyncRequest('GET', commentURL, null); 
} 


//initiates an XHR request 
CommentWidget.prototype.asyncRequest = function(method, uri, form) { 
    var o = createXhrObject() 
    if(!o) { return null; } 
    o.open(method, uri, true); 
    o.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
    var self = this; 
    o.onreadystatechange = function() {self.callback(o)}; 
    if (form) { 
    o.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
    o.send(makePostData(form)); 
    } else { 
    o.send(''); 
    } 
} 

//after a comment is posted, this rewrites the comments on the page 
CommentWidget.prototype.callback = function(o) {     
    if (o.readyState != 4) { return } 
    //turns the JSON string into a JavaScript object. 
    var response_obj = eval('(' + o.responseText + ')'); 
    this.comments = response_obj.comments; 
    this.refresh() 
} 

tôi mở mã nguồn mã này đây http://www.trailbehind.com/comment_widget

+0

Tuyệt. Cám ơn vì cái này. Tôi chỉ sử dụng nguyên mẫu vì tôi làm nhiều thứ hơn với nó, như sử dụng độ trễ, cập nhật và một số thứ nhỏ khác. – AntonioCS

2

này xuất phát từ nguyên mẫu chính thức:

Đánh giá một Phản hồi JavaScript Đôi khi ứng dụng được thiết kế để gửi mã JavaScript làm phản hồi. Nếu loại nội dung phản hồi khớp với loại MIME JavaScript thì điều này là đúng và Nguyên mẫu sẽ tự động trả về mã số eval(). Bạn không cần xử lý câu trả lời một cách rõ ràng nếu bạn không cần.

Ngoài ra, nếu phản ứng giữ một tiêu đề X-JSON, nội dung của nó sẽ phân tích, lưu lại dưới dạng một đối tượng và gửi đến callbacks như là đối số thứ hai:

mới Ajax.Request ('/ some_url', { phương pháp: 'get', onSuccess: chức năng (giao thông, json) {

alert(json ? Object.inspect(json) : "no JSON object"); 

} 

});

Sử dụng chức năng này khi bạn muốn tìm nạp dữ liệu không nhỏ với Ajax nhưng muốn tránh chi phí phân tích cú pháp phản hồi XML. JSON nhanh hơn và nhẹ hơn nhiều so với XML.

3

Có một thuộc tính của Response: Response.responseJSON chỉ được điền vào một đối tượng JSON nếu phụ trợ trả về Content-Type: application/json, tức lànếu bạn làm điều gì đó như thế này trong mã phụ trợ của bạn:

$this->output->set_content_type('application/json'); 
$this->output->set_output(json_encode($answer)); 
//this is within a Codeigniter controller 

trong trường hợp này Response.responseJSON = không xác định mà bạn có thể kiểm tra ở đầu nhận, trong onSuccess của bạn (t) handler:

onSuccess:function(t) { 
    if (t.responseJSON != undefined) 
    { 
    // backend sent some JSON content (maybe with error messages?) 
    } 
    else 
    { 
    // backend sent some text/html, let's say content for my target DIV 
    } 
} 

Tôi không thực sự trả lời câu hỏi về tham số thứ hai của trình xử lý, nhưng nếu nó tồn tại, chắc chắn Prototype sẽ chỉ cung cấp nó trong trường hợp loại nội dung thích hợp của phản hồi.

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