【问题标题】:JS/JQUERY TAB with history, compatibility具有历史记录、兼容性的 JS/JQUERY TAB
【发布时间】:2015-07-01 07:03:03
【问题描述】:

好的,我有一个网站,其中有几个选项卡显示不同的内容。我做了一件非常简单的事情来管理标签:

HTML:

<li id="thing1" class="tab selected"></li>
<li id="thing2" class="tab"></li>
<li id="thing3" class="tab"></li>

<div id="_thing1" class="box"></div>
<div id="_thing2" class="box hidden"></div>
<div id="_thing3" class="box hidden"></div>

JS/JQUERY:

$(".tab").on('click', function() {
        $(".tab").removeClass('selected');
        $(this).addClass('selected');
        $(".box").addClass('hidden');
        $( '#_' + $(this).attr('id') ).removeClass('hidden');
    }); 

一切正常,但我正在尝试将历史记录添加到我的标签点击中,所以当您点击浏览器时,您会转到您访问过的最后一个标签。

我做了一些研究,我有点困惑,似乎我需要实现的很多东西与所有浏览器都不兼容。 Jquery 还没有实现与历史相关的东西。

例如:on('hashchange') 似乎并不兼容所有浏览器。

这是我开始的:

$(".tab").on('click', function() {
history.pushState({id: $(this).attr('id')}, $(this).attr('id'), '#'+$(this).attr('id'));
}

那么有什么方法可以让我在没有插件的情况下轻松实现我想要的吗?

【问题讨论】:

  • 你试过通过 JS 操作浏览器历史吗?...
  • 您有许多插件可供选择,例如this oneThis example 会帮助你。
  • 是的,我做了,但我停止了,因为我对兼容性感到困惑。我不想做一些我需要在每个浏览器上测试并担心它会在哪个版本上运行的事情。
  • 这就是我建议你使用插件的原因,因为它已经过测试了。
  • 但是说真的,hashchange 得到了很好的支持总体

标签: javascript jquery push history hashchange


【解决方案1】:

您可以使用本地存储或会话存储来持久化您的标签历史示例 localstorage.setItem('selectedTab','TAB_ID');

【讨论】:

  • 我从来没有听说过,它是如何工作的,使用安全吗?它适用于所有浏览器,每种配置吗?我进行了快速搜索,您似乎正在将数据存储到浏览器中?每个浏览器都支持吗?这是常见的事情吗?
  • 如果它像我认为的那样有效,那么您可能已经解决了我遇到的另一个问题!
  • 它似乎适用于所有东西! caniuse.com/#feat=namevalue-storage
  • 是的,它几乎在所有支持 html5 的浏览器中都支持,但你必须确保你的 loacalstorage 必须在使用后像注销后一样清晰
【解决方案2】:

好吧,这就是我最终所做的,如果它可以帮助某人:

HTML:

<li id="thing1" class="tab first selected"></li>
<li id="thing2" class="tab"></li>
<li id="thing3" class="tab"></li>

<div id="_thing1" class="box"></div>
<div id="_thing2" class="box hidden"></div>
<div id="_thing3" class="box hidden"></div>

JS:

var realclick = true; // prevent adding history on hashchange

$(".tab").on('click', function() {
    id = $(this).attr('id');
    $(".tab").removeClass('selected');
    $( '#' + id).addClass('selected');
    $(".box").addClass('hidden');
    $( '#_' + id ).removeClass('hidden');
    if (realclick) {
        history.pushState(null, null,  '#'+id);
    }
}); 

$(window).on('hashchange', function(e){ // triggered by browser, previous and next button
    var id ='';
    realclick = false;
    if (location.hash!='') { // if has hash
        id = $(location.hash+".tab").attr('id');
        $('#'+id).click();
    }
    else { // no hash = initial page
        id = $(".first.tab").attr('id');
        $('#'+id).click();
    }
    realclick = true;
});

如果有人有一些改进要分享,欢迎! 我需要模拟点击我的标签,因为其中一些附加了其他事件,我需要保留它们。

【讨论】:

  • 很好的解决方案。我最终可能会在我正在进行的项目中使用它。
  • 很高兴它有帮助!我在查看您的评论时做了一些小改动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2020-10-10
  • 2011-05-14
  • 2018-05-03
  • 1970-01-01
  • 2023-03-22
  • 2019-01-23
相关资源
最近更新 更多