【问题标题】:jQuery: Multiple buttons Toggle multiple classes (filtering) with localStoragejQuery:多个按钮使用 localStorage 切换多个类(过滤)
【发布时间】:2017-03-09 17:35:12
【问题描述】:

我正在尝试创建可以显示/隐藏多个 div 的按钮,并且我还想使用 localStorage 来记住一个过滤器(单击了哪些按钮,哪些没有单击)。

我找到了this jsfiddle,并正在尝试使其适应我的目的。 Here is my jsfiddle。我非常感谢帮助更新此 jsfiddle 以使其正常工作:

  1. localStorage 不再有效;当我刷新页面时,不记得状态。 (它在原来的 jsfiddle 上做了)。我希望 localStorage 记住隐藏了哪些 div 并保留红色的“危险”按钮类
  2. 如果没有点击按钮:显示所有 div(工作正常)
  3. 如果点击了一项运动按钮,则仅显示该运动的 div(检查,但目前仅针对一项运动)
  4. 如果单击了多个运动按钮,则仅显示那些被切换的运动。隐藏其他未切换的。 (我的头脑在思考如何让它工作。不知道如何让不同的切换相互检查,看看哪些切换或没有切换)
  5. 按钮在未切换时为灰色,在切换时为红色(我现在让 toggleClass 在其中一个按钮上工作)
  6. 这可能不言而喻,但如果点击了所有运动按钮,则显示所有运动。

这是来自my fiddle的代码。

<button type="button" class="ncaabfilter btn btn-xs btn-default">NCAAB</button> <button type="button" class="ncaaffilter btn btn-xs btn-default">NCAAF</button> <button type="button" class="nbafilter btn btn-xs btn-default">NBA</button> <button type="button" class="nflfilter btn btn-xs btn-default">NFL</button>
<div class="ncaaf">
  NCAAF Game 1
</div>
<div class="nfl">
  NFL Game 1
</div>
<div class="nba">
  NBA Game 1
</div>
<div class="ncaab">
  NCAAB Game 1
</div>
<div class="ncaaf">
  NCAAF Game 2
</div>
<div class="nfl">
  NFL Game 2
</div>
<div class="nba">
  NBA Game 2
</div>
<div class="ncaab">
  NCAAB Game 2
</div>
$('.ncaabfilter').click(function(){
    $('.ncaaf, .nfl, .nba').toggle(800);

    var isVisible = $('.ncaaf, .nfl, .nba').is(':visible');
    localStorage.setItem('visible', isVisible);
    $('.ncaabfilter').toggleClass('btn-default btn-danger');
  });

var isVisible = localStorage.getItem('visible') === 'false' ? false : true;
$('.ncaaf, .nfl, .nba').toggle(isVisible);

非常感谢您的帮助!

更新:下面的 selami 指出 localStorage 不记得切换的 div 因为 800 秒。我想要一个动画,所以也许我让它在 localStorage 生效之前等待 800 秒?但是,当页面刷新时,如何让 localStorage 保留切换按钮的 btn-danger 类?

【问题讨论】:

  • 您没有提到点击其他按钮时应该显示哪些文本?
  • @VPK 抱歉,我认为这是隐含的。例如。如果单击 NCCAF,NCAAF div 应该会显示,而其他 div 会隐藏。如果您单击 NCAAF 和 NBA,NCAAF 和 NBA 比赛 div 应该会显示而其他人会隐藏。等等,
  • 如果所有按钮都没有被点击,即灰色,没有 div 应该正确显示?
  • 对不起,没有。根据上面的#2,如果没有点击按钮(新访问者访问时的默认状态),按钮应该是灰色的,但所有的 div 都应该显示。当没有按钮被切换(并且它们是灰色)或所有按钮都被切换(并且它们是红色)时,所有 div 都可以显示。谢谢!
  • 在我的回答中检查更新的小提琴。

标签: javascript jquery local-storage toggle


【解决方案1】:

toogle(800) 需要 800 毫秒,并且 :visible 属性设置在此时间之后。所以,var isVisible = $('.ncaaf, .nfl, .nba').is(':visible') 返回 true,因为它不会等待完成 togle。

还有 getItem('visible') === 'false' 包含 3 个相等的字符。删除其中一个。

试试下面的JS

$('.ncaabfilter').click(function(){
    $('.ncaaf, .nfl, .nba').toggle();

    var isVisible = $('.ncaaf, .nfl, .nba').is(':visible');
    localStorage.setItem('visible', isVisible);
    $('.ncaabfilter').toggleClass('btn-default btn-danger');
  });

var isVisible = localStorage.getItem('visible') == 'false' ? false : true;
$('.ncaaf, .nfl, .nba').toggle(isVisible);

要使用 800 个参数进行切换,请使用回调参数。 toggle() 方法完成后要执行的回调函数。

$('.ncaabfilter').click(function(){
  $('.ncaaf, .nfl, .nba').toggle(800, function () { 
    var isVisible = $('.ncaaf, .nfl, .nba').is(':visible');
    localStorage.setItem('visible', isVisible);
  });
  $('.ncaabfilter').toggleClass('btn-default btn-danger');
});

Working JSFiddle 800 动画

【讨论】:

  • 谢谢,800ms解决了localStorage不工作的问题。但是,localStorage 不记得刷新页面时切换按钮应该是类 btn-danger 。此外,我遇到的更大的问题是如何让所有这些按钮一起工作。谢谢!
  • 另外,我想保留 800 的动画。我该怎么做才能仍然包含它?谢谢。
  • 如果isVisible为真,则在JS末尾的按钮上添加btn-danger类
  • 回调有回调参数。 toggle() 方法完成后要执行的回调函数。在回调函数上设置 isVisible 属性。我编辑我的答案@iamse7en
  • 我没有发现任何问题。在你的小提琴中,在 togle 函数之后, .ncaabfilter 按钮的颜色是红色的。
【解决方案2】:

我认为你不需要localStorage,只需修改js代码,

$('.btn').click(function(){
    var button = $(this);
    var contents = button.text().trim().toLowerCase();
    if (button.hasClass('btn-danger')) {
        $('.' + contents).hide(800);
    } else {
        $('.' + contents).show(800);
    }
    $('.'+ contents +'filter').toggleClass('btn-default btn-danger');
});

这里是Working FIddle

我希望它可以按您的预期工作,这样您就不必删除动画,如果不告诉我。不需要为divs 添加类data。此外,我认为如果您默认保留按钮类 btn-danger 会更好,因为它表明所有选项都是可见的。

更新到记住按钮状态

如果您想记住 localStorage 中选定按钮的状态,请检查此Example to remember state。为此,您必须为用作 localStorage 中每个按钮的键的按钮添加 id 属性。按钮选择状态将作为这些键的值保留。

Updated fiddle 3

【讨论】:

  • 一个问题是,我希望默认(当有人第一次访问时)是显示所有 div 的灰色按钮。当所有按钮为灰色(默认)或全部为红色(在每个按钮都被切换后)时,所有 div 都会显示。这可能吗?此外,localStorage 的第二个小提琴不适合我。每次我刷新时,它仍然默认为所有按钮都显示为红色并显示所有 div。谢谢!
  • 假设您的用户第一次来到这个页面,所有按钮都被取消选择并显示所有 div,如果他/她选择了任何按钮,那么会发生什么?我的想法是当按钮是红色显示 div 时按钮是灰色隐藏 div .. 有了这个规则,它在第二小提琴中工作得非常好。如果您仍然想要您指定的行为,我会尝试..但我认为这是不一致的行为,因为用户会混淆红色和灰色按钮的含义..
  • 我的想法是:默认状态是不使用过滤选项。我可以看到它是如何不一致的,但它比所有按钮都亮红色(表示它们已被选中)或让它们开始隐藏要好。如果您不介意尝试将默认状态设置为灰色按钮和可见 div。另外:localstorage 在第二把小提琴中不起作用。我刷新,但忘记了状态(我点击的按钮)。
  • 我想得越多,我将不得不以一种新的方式来解决这个问题。特别是当过滤器相互冲突时。如果您可以尝试找出 localStorage 不起作用的原因,那就太好了。保留隐藏 div 的默认状态,不要担心更改它。这将非常有帮助。谢谢!
  • 嗨@iamse7en,很抱歉第二个链接在localStorage 中无法正常工作,我再次对其进行了修改,请在我的回答中检查链接Example to remember state
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2015-03-03
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多