У меня есть следующий вызов 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.После этого все работало прекрасно.