AJAX返回按钮菜单问题

5
我正在使用jquery $.ajax开发网站,以加载我在content/目录中拥有的不同页面的内容。我还使用hashtags来激活返回按钮、重新加载等功能。
但是,我有一个带有活动项目的主菜单,如果我在一个主菜单项目的页面深度导航,则该项目仍然处于活动状态。然后,我单击其中一个主菜单项目,例如“联系人”。因此,“联系人”菜单项变为活动状态。如果我点击浏览器的返回按钮,活动菜单项将不会更改。
那么,有没有办法记住活动主菜单项的状态?主菜单位于容器页面上。
谢谢!
$(function(){

        $('.menu a')
            .bind('click',function(e) {
                e.preventDefault();
                $('#content').html('Извините, страница не существует или находится в разработке!');
                $('.menu a').each(function() {$(this).removeClass('activelink');});
                location.hash=$(this).attr('href').match(/(([a-z]*)\W)*/)[2];

                $(this).addClass('activelink');
                return false;
            });

        $('#content').on('click','a',function(e) {
            if (!($(this).hasClass('address') || $(this).hasClass('zoom'))){
            e.preventDefault();
            $('#content').html('Извините, страница не существует или находится в разработке!');
            location.hash=$(this).attr('href').match(/(([a-z]*)\W)*/)[2];
            return false;
            }
            else {
                if ($(this).hasClass('address')) {
                alert('Вы покидаете сайт The House Of Events. Возвращайтесь к нам еще!');
                }
            }
        });

    function hashChange(){
        var page=location.hash.slice(1);
        if (page!=""){
            $.ajax({
                    type: "GET",
                    url: "content/" + page + ".html #sub-content",
                    success: function(data, status) {
                        $('#content').html(data);
                        },
                    error: function fail() {
                        $('#content').html('Error');
                        }
                });
        }
    }

    if ("onhashchange" in window){
        $(window).on('hashchange',hashChange).trigger('hashchange');
    } else { 
        var lastHash='';
        setInterval(function(){
            if (lastHash!=location.hash)
                hashChange();
            lastHash=location.hash;
        },100);
    }
});

发布您的主菜单代码以查看它如何激活菜单项。 - Nagarjun
检查 history.pushState() - d-_-b
问题在于我不知道如何确定此子菜单页面的主菜单项。或者是我理解有误? - Alex Holxey
1个回答

0

如果您坚持使用哈希标签,您可以创建一个小技巧。

编辑这些:

$('#content').on('click','a',function(e) {
  if(!($(this).hasClass('address') || $(this).hasClass('zoom'))){
    e.preventDefault();
    $('#content').html('Извините, страница не существует или находится в разработке!');
    var page=location.hash.slice(1).split('/')[0] + '/' + $(this).attr('href').match(/(([a-z]*)\W)*/)[2];
    location.hash=page;
    return false;
  } else {
    if ($(this).hasClass('address')) {
      alert('Вы покидаете сайт The House Of Events. Возвращайтесь к нам еще!');
    }
  }
});

function hashChange(){
  var page=location.hash.slice(1).split('/')[1];
  if(page==='undefined'){
    page=location.hash.slice(1).split('/')[0];
  }
  if(page!=""){
    $.ajax({
      type: "GET",
      url: "content/" + page + ".html #sub-content",
      success: function(data, status) { $('#content').html(data); },
      error: function fail() { $('#content').html('Error'); }
    });
  }
}

您还可以使用HTML5历史记录API。

将此放置在单击事件下(删除位置哈希)

var active=$('.menu a.active').attr('id'); // or var active=$('.menu a.active').text();
history.pushState({menu: active}, "Our events", "events.html");

然后使用onpopstate来使用后退按钮更改内容。

window.onpopstate = function(e){
  if(e.state){
    $('.menu a.activelink).removeClass('activelink')
    $('.menu #'+JSON.stringify(e.state.menu).replace(/"/gi,'')).addClass('activelink');
    var url=window.location.pathname;
    $.ajax({ ... })
  }
}

最后,如果您将许多类添加到菜单项并使用 .hasClass() 进行检查,则是最愚蠢的方法。


谢谢,但问题与不在主菜单中的页面有关。例如,我的路线是:我点击了主菜单项“我们的活动”->然后我在内容页面上找到了指向“婚礼”页面的链接,点击它并将其加载到我的内容div中。但是这个页面也是“我们的活动”的成员,所以它应该是活动的->然后我点击了主菜单上的“联系人”项目->然后我点击了浏览器的后退按钮,但发现主菜单中没有指向weddings.html的链接,因此“联系人”项目仍然处于活动状态。我需要一个“我们的活动”项目来代替“联系人”项目处于活动状态。 - Alex Holxey
然后你有两种方法来做到这一点。第一种方法是将类添加到菜单中,该类是子链接的名称。第二个选项是使用HTML5历史API,借助它,您可以使用'stateObj'处理程序添加您想要激活的菜单名称(您需要使用JSON)。并使用'JSON.stringify(e.state.name_of_the_handler)'调用该信息以获取数据。 - Nergal
菜单是一个JSON处理程序,active是一个变量。基本上,您将活动菜单的ID保存到浏览器历史记录中,每当浏览器调用它时,它会解析哪个菜单应该处于活动状态,以一种JS可以读取的方式。 如果您想了解更多信息,请参阅以下链接: http://diveintohtml5.info/history.html,http://en.wikipedia.org/wiki/JSON - Nergal
谷歌和其他搜索引擎的索引又怎么样? - Alex Holxey
1
实际上,搜索引擎不运行JS。对于谷歌来说有一个哈希-叹号(#!)的技巧,但其他搜索引擎都不使用它。每当谷歌发现像这样的链接domain.com/#!posts时,它会尝试打开这个domain.com/?_escaped_fragment=posts。这不是最好的方法。如果您使用HTML5历史API,请不要忘记以下几点:1. 它不受旧版浏览器支持(您可以在Firefox 4.0+;Safari 5.0+;Chrome 8.0+;Opera 11.50+;IE 10+中使用)。2. 在页面刷新时,onpopstate不会被触发。3. 搜索引擎不支持JS,它们将检查href属性下的所有内容。 - Nergal
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接