【发布时间】: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 中的警报会被忽略。 error 和 complete 也是如此。这在我的测试机器上运行良好。有问题的页面肯定在那里,我可以不用 ajax 来访问它。 Firebug 没有报告任何内容,错误控制台也没有报告。 Success 根本不会触发。
最奇怪的部分是,如果我手动重新加载,欢迎通常会消失,这表明 ajax 调用 确实 触发了。它只是再也没有回来。这里发生了什么?我无计可施。有人看到我还没有叫过的树吗?
解决方案:
CakePHP 应该自动检测 ajax 调用。但在这种情况下,它不是。结果,它运行了我为 Ajax 提供的代码,但是当它找不到视图时返回 404。解决方案是将$this->autoRender= false; 附加到ajax 处理控制器函数的末尾。之后一切都很顺利。
【问题讨论】:
-
你点击的
<a>是什么样的?