2010-01-15 60 views
0

请考虑这一点:在页面AI上有一个链接,当JS关闭时,您可以进入页面B,但是当JS打开时,我想用页面B中的内容替换当前页面上的内容。jQuery AJAX重定向问题

页面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; 
}); 
+1

您可以将页面B中的内容放在'

+0

谢谢,但这不是一个选项,几乎网页上的每个链接都将被AJAX处理,一个将下载页面的完整内容。 – mirosval

+0

你能提供页面A和页面B的结构吗?你希望页面B内容出现在页面A中,还是替换页面A中的所有当前内容?为什么用户必须首先进入页面A,这有什么理由? –

回答

0

由于事实头在重定向之后没有被正确地传递,似乎一个好的选择是允许查询字符串变量指示请求的isAjax状态以及x请求的标题。因此,如果您的301重定向是由.htaccess文件生成的,则只需在重定向时将查询字符串参数传递到新路径。例如:

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

所以你的pageB.php要求isAjax = 1将pageC.php isAjax = 1,导致来自服务器的正确格式的响应?

+0

看,这是一个问题。整个事情应该是一个WordPress主题,所以我不能编辑.htaccess。我需要一种在JS或PHP中执行此操作的方法... – mirosval

+0

那么取决于为什么生成301,我想像Wordpress可以传递查询字符串参数,就像.htaccess snip-it那样。唯一需要注意的是,你需要配置Wordpress来将isAjax查询字符串变量解释为AJAX请求的有效标识符,我相信这是可能的。 – BBonifield

0

既然你加载pageB的直接访问和使用AJAX,我通常把简单,如果在这样的页面。 网页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

谢谢你的回答,但我已经这么做了,恰恰是这个问题,服务器上的一个请求会导致重定向,浏览器会依次以正确的URL重新加载页面,但无法发送http_x_requested_with,这就是为什么解决方案你建议和我使用不起作用。 window.location.hash = url作为历史记录的基础和发送电子邮件当前URL的能力 – mirosval

+0

服务器中的所有AJAX请求都没有'HTTP_X_REQUESTED_WITH'或只有页面A和页面B中的代码?也许是为了解决方法,当请求页面B时可以传递一个参数:'$ .get('pageB',{'partial':1},function(data){// process});',但这只会用于临时固定。不要继续。 –