无法识别CakePHP AJAX请求

无法识别CakePHP AJAX请求,php,jquery,ajax,cakephp,Php,Jquery,Ajax,Cakephp,我正试图为CakePHP2.2中元素列表中的每个项目创建一个favorite/star/heart按钮(就像Gmail中的一样) 我有一个工作的控制器和一个JS切换函数,但我的问题是,我的脚本中的AJAX部分实际上没有发生;相反,页面将重定向到自身(作为关闭JavaScript的浏览器的备用方案的一部分)并重新加载。这就是我试图避免的,这样用户就不会失去他们在页面上的位置 以下是我的CakePHP控制器,用于取消项目的收藏: class MarksController extends AppCo

我正试图为CakePHP2.2中元素列表中的每个项目创建一个favorite/star/heart按钮(就像Gmail中的一样)

我有一个工作的控制器和一个JS切换函数,但我的问题是,我的脚本中的AJAX部分实际上没有发生;相反,页面将重定向到自身(作为关闭JavaScript的浏览器的备用方案的一部分)并重新加载。这就是我试图避免的,这样用户就不会失去他们在页面上的位置

以下是我的CakePHP控制器,用于取消项目的收藏:

class MarksController extends AppController {
    public $components = array('RequestHandler');

    public function unfav($id = null) {
        // set default class & message for setFlash
        $class = 'flash_bad';
        $msg   = 'Invalid List Id';

        if ( validation($id) ) {
            //load this mark's data
            $this->request->data = $this->Mark->read(null, $id);
            $this->request->data['Mark']['favorite'] = '0';
            if ($this->Mark->save($this->request->data)) {
                $class = 'message';
                $msg   = 'The WatchMark has removed from favorites.';
            } else {
                $msg = 'This WatchMark could not be saved. Please, try again.';
            }

            $this->autoRender= false;
            $this->autoRender = $this->layout = false;

            // output JSON on AJAX request
            if($this->request->is('ajax')) {
                echo json_encode(array('success'=>($class=='flash_bad') ? FALSE : TRUE,'msg'=>"{$msg}"));
                exit;
            }

            // set flash message & redirect
            $this->Session->setFlash($msg,'default',array('class'=>$class));
            $this->redirect($this->referer());

        } else {
            //trying to edit a mark that doesn't belong to this user:
            throw new NotFoundException(__('Invalid mark'));
        }  // end ownedby check
    } //end markfav method
我有另一个类,叫做markfav的逆函数(将它们组合成一个切换函数是另一天的任务)

然后,在JQuery和JavaScript方面:

$(document).ready(function() {
    // class exists
    if($('.fav_toggler').length) {
        // add click handler
        $('.fav_toggler').click(function(e){
            $('#flashMessage').fadeOut();
            if($(this).hasClass("heart")) {
                $.post('/marks/markfav/' + $(this).attr('target_id'), "ajax=1", function(response) {
                    if(response.success == true) {
                        $(this).addClass("heart").removeClass("hearttoggle");
                    }
                },'json');
            }        
            else {
                $.post('/marks/unfav/' + $(this).attr('target_id'), "ajax=1", function(response) {
                    if(response.success == true) {
                        $(this).addClass("heart").removeClass("hearttoggle");
                    }
                },'json');
            }
            e.preventDefault();
        });
        return false;
    }
});
我已经通过向JavaScript中发送警报进行了测试,我认为它的执行是正确的(它到达了代码的正确部分,并在heart和hearttoggle之间更改了类)

我还知道,出于某种原因,它跳过了PHP中的
if($this->request->is('ajax'))
块(尽管我有一个ajax删除函数,可以很好地命中类似的条件)。我已经测试过删除
if($this->request->is('ajax'))
PHP块中的条件,强制它执行JSON_编码位,我只会得到一个包含JSON编码数组的页面,而没有其他内容

如何在不重新加载页面的情况下使用AJAX使其正常工作


编辑:调用/marks/unfav/624的标题

Request URL:http://towatchlist.com/marks/unfav/624
Request Method:GET
Status Code:200 OK

Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:CAKEPHP=blah
Host:towatchlist.com
Referer:http://towatchlist.com/marks
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_1) AppleWebKit/537.8 (KHTML, like Gecko) Chrome/23.0.1255.0 Safari/537.8

Response Headers
Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 09 Sep 2012 20:55:18 GMT
Keep-Alive:timeout=5, max=94
Server:Apache/2.2.22 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.10-1ubuntu3.2
由于某些原因未显示。它应在您的请求标头中显示:

X-Requested-With: XMLHttpRequest
以下是一些可能有帮助的问题:


正在工作的AJAX请求的调用方式是否与此相同?

在您的操作中,执行
pr($this)
(启用调试),然后检查它是否显示请求是AJAX。另外,请尝试
$this->ResquestHandler->isAjax()
。它在2.x上已被弃用,但请查看给出了什么。当我执行
pr($this)时
我得到了列表中所有项目的一个长转储(不确定这是否正是您想要的)。所有项目都有
[isAjax]=>
(意思是未设置)。这就是您要查找的信息吗?我尝试了
$this->ResquestHandler->isAjax()
,因为它在我的AJAX删除按钮中工作,但我的结果没有变化(如预期的那样)。是的,
[isAjax]
正是我想要的。这表明您的请求没有被视为AJAX请求。您是否有firebug或任何调试工具来检查浏览器发送的请求?即发送的数据和请求头。我将从Chrome的网络调试器转储的头添加到上述问题中(此处没有空间容纳它们)。如果您需要更多,请告诉我。谢谢。谢谢!您的信息和问题帮助我解决了这个问题。我没有您所说的正确的标题。原因是我在试图附加JQuery调用的项目上仍然有一个
onclick
元素。因此,
onclick
将启动,而不是JQuery ajax位。删除
onclick
修复了我的标题。