JQuery AJAX проблема перенаправления - PullRequest
0 голосов
/ 15 января 2010

пожалуйста, примите во внимание следующее: на странице A у меня есть ссылка, которая ведет вас на страницу B, когда JS выключен, но когда JS включен, я хочу заменить содержимое на текущей странице содержимым со страницы B.

Страницы A и B на самом деле являются одним и тем же сценарием, который может отличать вызовы AJAX от обычных и соответствующим образом обслуживать контент. Все работает нормально, пока не происходит перенаправление.

Но иногда происходит перенаправление 301, и, похоже, происходит то, что клиентский браузер затем делает второй запрос, который возвращает 200 OK. Только второй запрос отправляется без заголовка X-Requested-With, поэтому я не могу сказать в моем скрипте, пришёл он из AJAX или нет, и отправит полную страницу вместо только содержимого.

Я попытался проверить код состояния 301 в обработчиках ошибок, успешных и полных обработчиков, но ни один из них не сработал. Кажется, что он обрабатывает 301 за кулисами.

Может ли кто-нибудь помочь мне с этим?

jQuery 1.4, PHP 5

Редактировать: Люди просили код для этого, который я не считал необходимым, но здесь идет:

// hook up menu ajax loading
$('#menu a').live("click", function(){
    // update menu highlight
    if($(this).parents('#menu').size() > 0){
        $("#menu>li").removeClass("current_page_item");
        $(this).parent().addClass("current_page_item");
    }
    // get the URL where we will be retrieving content from 
    var url = $(this).attr('href');

    window.location.hash = hash = url;

    $.ajax({
        type: "GET",
        url: url,
        success: function(data){
            // search for an ID that is only present if page is requested directly 
            if($(data).find('#maincontent').size() > 0){
                data = $(data).find('#maincontent .content-slide *').get();
            }
            // the rest is just animating the content into view
            $("#scroller").html(data);
            $('.content-slide').each(setHeight);

            $('.content-slide').animate({
                    left: "0px"
                }, 1000, 'easeOutQuart', 
                function(){
                    $('#home').css("left", "-760px").html(data);
                    $('#scroller').css("left", "-760px");
                    $('.content-slide').each(setHeight);
                }
            );
        }
    });

    return false;
});

Ответы [ 2 ]

0 голосов
/ 17 января 2010

Поскольку вы загружаете страницу B либо с прямым доступом, либо с использованием AJAX, я обычно помещаю простое if in page как этот. Страница B будет выглядеть так:

<?php $is_ajax = ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'); ?>
<?php if ( ! $is_ajax ): ?>
<html>
<!-- full page content for direct access -->
<?php endif; ?>
<!-- page content that for AJAX request and direct access -->
<div id="maincontent">
<!-- content here -->
</div>
<!-- end of page content that for AJAX request and direct access -->
<?php if ( ! $is_ajax ): ?>
<!-- rest of page content -->
</html>
<?php endif; ?>

Тогда ваш код jQuery не будет нуждаться в проверке, просто получите страницу и добавьте ее в scroller.

//I prefer just user $.get
$.get(url, {}, 
  function(data){
    // the rest is just animating the content into view
    $("#scroller").html(data);
    //...
  });

При этом мне не нужно фильтровать данные ответа из запроса AJAX.

У меня есть к вам один вопрос. Что делает этот код?

window.location.hash = hash = url;

Может быть, это и является причиной странного перенаправления.

Если вы все еще испытываете странное перенаправление, отладка с использованием Firebug и просмотр журнала apache могут помочь вам найти источник ошибки.

0 голосов
/ 15 января 2010

Из-за того, что заголовки не передаются должным образом после перенаправления, кажется хорошим вариантом было бы разрешить переменной строки запроса указывать состояние запроса isAjax, а также запрос x -с заголовком Поэтому, если ваши перенаправления 301 генерируются файлом .htaccess, вам просто нужно будет передать аргументы строки запроса на новый путь при перенаправлении. Например:

RewriteEngine on
RewriteRule pageB.php$ pageC.php?%{QUERY_STRING} [L,R=301]

Таким образом, ваш запрос для pageB.php? IsAjax = 1 будет pageC.php? IsAjax = 1, что приведет к правильно отформатированному ответу сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...