【问题标题】:Why isn't my ajax call completing, it's sending, but I receive a 404 in response from CakePHP?为什么我的 ajax 调用没有完成,它正在发送,但是我收到了来自 CakePHP 的 404 响应?
【发布时间】:2010-12-03 17:32:06
【问题描述】:

我有以下 ajax 调用:

$("#welcome a.close").click(function(e) {
    $.ajax({
        type: "GET",
        url: "/visitors/hide_welcome",
        success: function(){
            $("#welcome").hide(0);
            e.preventDefault();
        }
    });
});

针对我网站的以下部分:

<div id="welcome">
    <h2>Welcome  <a class="close" href="Javascript:;"></a></h2>
    <div class="left">
    </div>
    <div class="right">
        <div class="loginElement">

        </div>
    </div>
    <div class="clear"></div>
</div>

用下面的代码回答ajax请求:

<?php
class VisitorsController extends AppController {

        function hide_welcome() {
                if($this->RequestHandler->isAjax()) {
                        $this->Session->write('Welcome.hidden', true);
                        echo 'Success.';
                }
                else {
                        echo 'I am, in fact, here.<br>';
                        $this->autoRender = false;
                }
        }

}
?>

这很简单。它调用/visitors/hide_welcome 来设置一个会话变量,指出他们已经隐藏了欢迎。但它似乎没有完成。如果我在它的任一侧放置警报,如下所示:

$("#welcome a.close").click(function(e) {
    alert("Begin.");
            $.ajax({
        type: "GET",
        url: "/visitors/hide_welcome",
        success: function(){
            $("#welcome").hide(0);
            e.preventDefault();
        }
    });
            alert("End.");
});

它们会触发。但是放在success 中的警报会被忽略。 errorcomplete 也是如此。这在我的测试机器上运行良好。有问题的页面肯定在那里,我可以不用 ajax 来访问它。 Firebug 没有报告任何内容,错误控制台也没有报告。 Success 根本不会触发。

最奇怪的部分是,如果我手动重新加载,欢迎通常会消失,这表明 ajax 调用 确实 触发了。它只是再也没有回来。这里发生了什么?我无计可施。有人看到我还没有叫过的树吗?

解决方案:

CakePHP 应该自动检测 ajax 调用。但在这种情况下,它不是。结果,它运行了我为 Ajax 提供的代码,但是当它找不到视图时返回 404。解决方案是将$this-&gt;autoRender= false; 附加到ajax 处理控制器函数的末尾。之后一切都很顺利。

【问题讨论】:

  • 你点击的&lt;a&gt;是什么样的?

标签: php jquery ajax cakephp


【解决方案1】:

认为考虑到您的症状,您将重定向到您单击的&lt;a class="close"&gt; 指向的任何 URL - 因为 默认 行为没有被阻止.

e.preventDefault() 调用应该发生在基本方法中,而不是回调,如下所示:

$("#welcome a.close").click(function(e) {
    $.ajax({
        type: "GET",
        url: "/visitors/hide_welcome",
        success: function(){
            $("#welcome").hide(0);
        }
    });
    e.preventDefault();
});

【讨论】:

  • 没有明显的 Firefox 加载,但我想它可能发生得足够快,以至于我没有注意到。我会尝试这种改变。
  • @Daniel - 我在通过 XMLHttpRequest 访问 URL 时收到 404,需要查看为什么您的服务器阻止了对同一路径的 AJAX 请求。在你的控制台中试试这个 - $.get("/visitors/hide_welcome");
  • @Daniel - 不需要,我现在看到了你当前的代码......但是 AJAX 请求失败了,你的服务器似乎以不同的方式处理 AJAX 请求,它似乎要检查 X-Requested-With:XMLHttpRequest 标头并为此提供 404...没有标头的普通 XMLHttpRequest 仍然有效。例如在页面中试试这个:var req = new XMLHttpRequest(); req.open('GET', 'http://www.fridgetofood.com/visitors/hide_welcome', false); req.send(null); if(req.status == 200) console.log(req.responseText);
  • @Daniel - 这部分有效,在 404 响应中您会收到 Success. 后跟整个网页,但它是 404 响应代码,而不是 200...虽然不熟悉 Cake,所以您需要结束响应(例如die),并设置正确的状态码。
  • 你需要告诉它每次它是ajax请求时使用ajax布局,你可以在app_controller::beforeFilter()中这样做,让它跨控制器工作。
【解决方案2】:

尝试像这样将数据添加到您的成功回调中:

$.ajax({
    type: "GET",
    url: "/visitors/hide_welcome",
    success: function(data){
        $("#welcome").hide(0);
        e.preventDefault();
    }
});

编辑: 尝试提供你的 url 的绝对路径:

$.ajax({
    type: "GET",
    url: "http://fridgetofood.com/visitors/hide_welcome",
    success: function(data){
        $("#welcome").hide(0);
        e.preventDefault();
    }
});

【讨论】:

  • 呃,这是故意的吗? ,chrome 中的第 42 行
  • 是的,你可以用空格分隔类,它们会被忽略。为了安全起见,无论如何我都会删除它。
  • 很好奇,我的代码中没有那个空格,Firefox 生成的源代码中也没有这个空格...
  • 正如 nick 提到的,我认为是您的服务器阻止了 ajax 连接?我猜您使用的是 CakePHP,您可以使用 RequestHandler 组件测试 AJAX 请求,如下所示: if($this->RequestHandler->isAjax())
  • 在你的 app_controller::beforeFilter() 中添加这个: if($this->RequestHandler->isAjax()) $this->layout = 'ajax';一个建议:p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2021-06-03
  • 2016-06-03
  • 2012-04-25
  • 2013-01-05
相关资源
最近更新 更多