获取json的Ajax响应回调

时间:2009-05-17 22:17:56

标签: php javascript ajax prototypejs

我正在尝试创建一个小的ajax聊天系统(只是为了它),我正在使用prototype.js来处理ajax部分。

我在帮助中读到的一件事是,如果你返回json数据,回调函数将在第二个参数中填充json数据。

所以在我调用的php文件中我有:

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

在ajax请求中我有:

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

response.responseText的警报给了我{“lastid”:8}但是json给了我null。

任何人都知道如何才能使这项工作?

4 个答案:

答案 0 :(得分:22)

这是检索JSON with Prototype

的正确语法
onSuccess: function(response){
   var json = response.responseText.evalJSON();
}

答案 1 :(得分:3)

有一个Response:Response.responseJSON属性,只有当后端返回Content-Type:application / json时才会填充JSON对象,即如果你在后端代码中执行类似的操作:

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

在这种情况下,Response.responseJSON!= undefined,您可以在onSuccess(t)处理程序中检查接收端:

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

我并没有真正回答关于处理程序的第二个参数的问题,但如果确实存在,那么Prototype只会在响应的内容类型正确的情况下提供它。

答案 2 :(得分:2)

这来自Prototype官方:

  

评估JavaScript响应   有时应用程序是设计的   发送JavaScript代码作为响应。   如果响应的内容类型   匹配JavaScript的MIME类型   那么这是真的,原型会   自动eval()返回代码。   您无需处理响应   明确的,如果你不需要。

     

或者,如果答复持有   X-JSON标题,其内容将是   解析,保存为对象并发送给   回调作为第二个参数:

     

new Ajax.Request('/ some_url',{   方法:'get',onSuccess:   function(transport,json){

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

}   
     

});

     

如果要获取非平凡的内容,请使用此功能   使用Ajax但希望避免的数据   解析XML响应的开销。   JSON比它快得多(也更轻)   XML。

答案 3 :(得分:1)

您也可以跳过框架。这是一个跨浏览器兼容的方法来执行ajax,在评论小部件中使用:

//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()
}

我在这里开源了这段代码http://www.trailbehind.com/comment_widget