我正在尝试编写一个简单的JSON帖子,无论我做什么,回调警报都不会显示。我使用了萤火虫来查看帖子是否得到任何回复并且“SHOE”返回。那么为什么警报不能在回调中起作用?
查看代码:
$('#GaragePartAddfrompartlistForm').click(function() {
var item = "CHEESE";
$.post("garage_parts/getlastid", { 'item' : item },
function(data){
alert(data.result);
}, "json");
});
控制器代码:
function getlastid() {
$newid = "SHOE";
$array = array('result' => $newid);
echo json_encode($array);
}
答案 0 :(得分:3)
确保在beforeFilter中将debug设置为0,使用RequestHandler组件检查它是否是ajax请求。
使用RequestHandler
var $components = array(..., 'RequestHandler', ...);
如果是ajax请求,则将debug设置为0
function beforeFilter()
{
if ($this->RequestHandler->isAjax()) {
Configure::write('debug', 0);
}
}
并在您的函数中
function getlastid()
{
$this->autoRender = false;
$this->autoLayout = false;
$newid = "SHOE";
$response = array('result' => $newid);
$this->header('Content-Type: application/json');
echo json_encode($response);
return;
}
如果你回显json并且没有将debug设置为0,那么cake会在最后添加执行时间,并且它不会是一个有效的json响应,阻止jQuery正确读取它。
作为额外的,通常我会在$ response中设置更多东西,所以我可以更好地处理它。
function getLastId()
{
...
$response = array('success' => false);
... code ...
if ($my_code_is_good) {
$response['success'] = true;
$response['data'] = $my_code_result;
}
...
}
希望这有帮助
答案 1 :(得分:1)
您应该尝试在响应中设置HTTP标头:
header("Content-type: application/json")
或
header("Content-type: text/plain")
jQuery可能没有处理你的响应,因为它没有得到预期的类型。
您的回复代码将是:
function getlastid() {
header("Content-type: text/plain");
$newid = "SHOE";
$array = array('result' => $newid);
echo json_encode($array);
}
希望这有帮助!
答案 2 :(得分:0)
不要忘记为Ajax响应设置空布局:
function getlastid() {
$this->layout = 'ajax';
...
答案 3 :(得分:0)
我对蛋糕不太熟悉,但我使用codeigniter(类似)...
我注意到这样的框架的一件事是,当您使用echo json_encode($array)
发送json响应时,您必须立即在下一行输入exit();
。另外,框架会发出表示html mime-type的标题。
可能就是蛋糕的情况,无论如何都值得一试......
答案 4 :(得分:0)
我发现使用我的symfony / PHP应用程序,没有HTML字符的普通文本响应(使用null或'json'dataType)将触发成功回调。但是,如果服务器没有输出除header之外的任何内容,则不会调用成功回调(我认为这是一个错误)。
此外,如果服务器响应包含HTML字符(<> etc),则除非将上下文类型显式设置为text / html,否则不会再调用回调。这也消除了恼人的<预>标签添加错误的jQuery以及阻止jQuery将响应转换为HTML实体(& lt;& gt;等)。