我正在尝试创建一个小的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。
任何人都知道如何才能使这项工作?
答案 0 :(得分:22)
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