ajax加载的URL哈希转换问题

时间:2012-10-31 17:26:34

标签: javascript ajax wordpress url hashchange

我有一个功能性的wordpress主题,通过ajax加载内容。我遇到的一个问题是,当直接加载页面时,ajax脚本不再有效。例如,链接结构的工作原理如下,在www.example.com上点击about页面链接,然后链接变为www.example.com/#/about。但是,当我直接加载独立页面www.example.com/about时,从此页面点击的其他链接将变为www.example.com/about/#/otherlinks。我从这个tutuorial http://www.deluxeblogtips.com/2010/05/how-to-ajaxify-wordpress-theme.html修改了一些代码。这是我的代码。谢谢你的帮助。

jQuery(document).ready(function($) {
var $mainContent = $("#container"),
    siteUrl = "http://" + top.location.host.toString(),
    url = ''; 

$(document).delegate("a[href^='"+siteUrl+"']:not([href*=/wp-admin/]):not([href*=/wp-login.php]):not([href$=/feed/]))", "click", function() {
    location.hash = this.pathname;
    return false;
}); 

$(window).bind('hashchange', function(){
    url = window.location.hash.substring(1); 

    if (!url) {
        return;
    } 

url = url + " #ajaxContent"; 

    $mainContent.fadeOut(function() {
        $mainContent.load(url,function(){
            $mainContent.fadeIn();
        });        
      });
    });

  $(window).trigger('hashchange');

});

1 个答案:

答案 0 :(得分:2)

您所表达的问题并不容易解决。有多个因素岌岌可危,但归结为:

  • 对网址的任何更改都会触发网页重新加载
  • 只有例外,如果只有网址的哈希部分发生变化

正如您所知,网址www.example.com/about/中没有哈希部分。因此,您的脚本无法更改此部分,否则会触发页面重新加载 了解这一事实后,您的脚本只会通过添加新的哈希部分或修改现有哈希部分来更改URL,而只留下URL的“路径名”部分。因此,您可以获得www.example.com/about /#/ otherlinks等网址。

现在,从我的观点来看,有两种方法可以解决你的问题。

首先,有一个API that can modify the whole URL pathame without reload,但it's not available everywhere。使用此解决方案并回退到旧浏览器的经典页面重新加载是cleaner method

否则,您可以强制页面重新加载一次,将URL重置为www.example.com/,并从良好的基础开始。这是代码:

$(document).delegate("a[href^='"+siteUrl+"']:not([href*=/wp-admin/]):not([href*=/wp-login.php]):not([href$=/feed/]))", "click", function() {
    location = location.assign('#' + this.pathname);
    return false;
}); 

应该注意的是,如果您的站点不在路径名的根目录下,则此脚本将不起作用。因此,要使其适用于www.example.com/mysite/,您需要更改正则表达式。

请告诉我它是怎么回事。