Почему мой вызов ajax не завершается, он отправляется, но я получаю 404 в ответ от CakePHP? - PullRequest
0 голосов
/ 03 декабря 2010

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

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

Я думаю учитывая ваши симптомы, вы перенаправляете на любой URL, на который указывал <a class="close">, на который вы нажимаете - поскольку поведение по умолчанию не предотвращается.

Вызов e.preventDefault() должен происходить в базовом методе, а не в обратном вызове, как это:

$("#welcome a.close").click(function(e) {
    $.ajax({
        type: "GET",
        url: "/visitors/hide_welcome",
        success: function(){
            $("#welcome").hide(0);
        }
    });
    e.preventDefault();
});
1 голос
/ 03 декабря 2010

Попробуйте добавить данные к вашему успешному обратному вызову следующим образом:

$.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();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...