【问题标题】:AJAX deeplinking with jQuery Address使用 jQuery 地址进行 AJAX 深度链接
【发布时间】:2010-04-27 05:46:03
【问题描述】:

我有一个有很多页面的网站:

例如:

首页:http://mywebsite.com/index.html

一些页面: http://mywebsite.com/categorie/somepage.html

我决定让我的页面使用 AJAX 动态加载,而无需重新加载页面。所以我决定使用 jQuery Address 插件 (http://www.asual.com/jquery/address/docs/) 来实现深度链接和后退导航:

<script type="text/javascript" src="uploads/scripts/jquery.address-1.2rc.min.js"></script>
<script type="text/javascript">
                $('a').address(function() {
                    return $(this).attr('href').replace(/^#/, '');
                });
</script>

现在,安装插件后,如果我继续 http://mywebsite.com/index.html (HOME) 并单击 SOME PAGE 链接,jquery 会成功加载 http://mywebsite.com/categorie/somepage.html 而无需重新加载我的浏览器上的页面和地址栏显示: http://mywebsite.com/index.html/#/categorie/somepage.html 太棒了!

但是,问题是:如果我复制这个动态生成的 URL:http://mywebsite.com/index.html/#/categorie/somepage.html 进入网络浏览器地址栏,它将进入我的网站 index.html 页面,而不是“SOME PAGE”页面。此外,前进/后退按钮无法正常工作,它们只会替换 URL 栏中的地址,但内容保持不变。

我想我需要编写一些将动态 URL 与正确页面相关联的 JavaScript 规则?

我们将不胜感激。谢谢:)

【问题讨论】:

  • 需要考虑的一点:如果没有 JavaScript 的用户访问这样的链接怎么办?
  • 我也在考虑同样的事情......也许是 .htaccess 重定向规则?

标签: jquery ajax deep-linking jquery-address


【解决方案1】:

复制粘贴网址到地址栏正在工作 后退/下一步按钮也可以使用。

# 应该在那里让它工作

任何人都知道如何使 #! 使其可被 google 索引吗?

#/是一回事吗?

基本上这在 wordpress 上对我有用:

// ajax setup
$.ajaxSetup({cache:false, success: function() { 
// optional action here
}});  

// Event handlers
$.address.init(function(event) {
  $('#nav li a').address(function() {
  return $(this).attr('href').replace(location.pathname, '');
   });
 }).bind('externalChange', {}, function(event) {
    var post_id; // get page id
    var nav_id; // get nav class
    // for back button 
    switch (true) {
     case (event.value == undefined):
           post_id = 2; nav_id = 'home'; break;
     case (event.value == "/about"):
           post_id = 19; nav_id = 'about'; break;
     case (event.value == "/product"):
           post_id = 26; nav_id = 'product'; break;

    ...etc....

     default: post_id = 2; nav_id = 'home';
    }

    // content loader on back/next button
    $("#content-wrap").load("http://www.somesite.com/home/",{id:post_id}); // load content
 });   

 // content loader by #nav 
 $(document).on("click","#nav li a",function(e){                                         
   var post_id = $(this).attr("id"); // get page id   
   $("#content-wrap").load("http://www.somesite.com/home/",{id:post_id}); // load content  
   return false; // keep url, no refresh
 });

【讨论】:

    【解决方案2】:

    类似这样的:

    $(function () {
        var path = location.hash.substring(1); // remove '#'
        if (path) {
            $.address.value(path);
        }
    });
    

    更新:

    如果您手动加载页面(例如点击链接)而不是使用地址事件处理程序(例如$.address.change(function () { ... })),则将上面的$.address.value(path); 替换为path 页面的Ajax 调用:

    $(function () {
        var path = location.hash.substring(1); // remove '#'
        if (path) {
            // get page at path
        }
    });
    

    【讨论】:

    • 对不起,我不太明白。但是,我发现了另一个插件,它似乎提供了相同的功能:benalman.com/projects/jquery-bbq-plugin 这个插件使用 via hashchange 事件。我要试一试。
    【解决方案3】:

    您可以通过添加以下内容使其可被 Google (#!) 索引: $.address.crawlable(true); 这是一个我发现对 jQuery 地址方法很有帮助的链接: http://www.asual.com/jquery/address/docs/

    【讨论】:

      最近更新 更多