Jquery JSON Ajax回调不起作用 - Cakephp

时间:2009-10-23 20:20:55

标签: jquery ajax json cakephp callback

我正在尝试编写一个简单的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); 
    } 

5 个答案:

答案 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;等)。