javascript - Bootstrap Accordion 。保留多个面板的页面加载状态

标签 javascript jquery json twitter-bootstrap accordion

我在表单页面上使用 Bootstrap Accordion 。用户可以同时打开多个面板。提交表单后,我想保留任何打开的 Bootstrap Accordion 面板的状态。

我修改了在堆栈溢出上找到的一些代码,以使用本地存储来执行此操作,如下所示:

Accordion HTML
-------------------

<div class="panel-group" id="accordion">

  <div class="panel panel-default">
    <div class="panel-heading">
      <div class="panel-title"> <a data-toggle="collapse" href="#client_12325">Panel heading</a> </div>
    </div>
    <div id="client_12325" class="panel-collapse collapse">
      <div class="panel-body">Panel Content</div>
    </div>
  </div>

  <div class="panel panel-default">
    <div class="panel-heading">
      <div class="panel-title"> <a data-toggle="collapse" href="#client_12326">Panel heading</a> </div>
    </div>
    <div id="client_12326" class="panel-collapse collapse">
      <div class="panel-body">Panel Content</div>
    </div>
  </div>

 <div class="panel panel-default">
    <div class="panel-heading">
      <div class="panel-title"> <a data-toggle="collapse" href="#client_12327">Panel heading</a> </div>
    </div>
    <div id="client_12327" class="panel-collapse collapse">
      <div class="panel-body">Panel Content</div>
    </div>
  </div>

</div>

Javascript
---------------

<script>
$(document).ready(function() {

    var retainState = [];
    localStorage.setItem('retainState', JSON.stringify(retainState));

    $('#accordion').on('shown.bs.collapse', '.panel-collapse', function() {
        retainState = JSON.parse(localStorage.getItem('retainState'));
        if ($.inArray($(this).attr('id'), retainState) == -1) {
            retainState.push($(this).attr('id'));
        };
        localStorage.setItem('retainState', JSON.stringify(retainState));
    });

    $('#accordion').on('hidden.bs.collapse', '.panel-collapse', function() {
        retainState = JSON.parse(localStorage.getItem('retainState'));
        retainState.splice( $.inArray($(this).attr('id'), retainState), 1  ); //remove item from array
        localStorage.setItem('retainState', JSON.stringify(retainState));
    });

});


var retainStateArray = JSON.parse(localStorage.getItem('retainState'));
var arrayLength = retainStateArray.length;
for (var i = 0; i < arrayLength; i++) {
    var panel = '#'+retainStateArray[i];
    $(panel).addClass('in');
    console.log(panel);
}
</script>

此代码有 2 个问题

1/它在页面刷新时获取正确的面板 ID(您可以通过循环内的控制台日志查看),但是它无法将类“in”添加到面板中。

2/它仅保留第一页重新加载的状态。我希望它保留整个用户 session 的状态,无论页面重新加载多少次。

提前致谢。

最佳答案

为什么不使用 js-cookies如果您不反对添加额外的 js 库。

单击提交按钮后,使用选择了“in”类的 ID 创建一个 Cookie。

如果cookie不存在
观察到默认的 Accordion 状态。

如果 cookie 确实存在
测试当前页面是否存在“#accordion”
从 cookie 中获取 ID
解析 dom 获取 ID
应用类“in”

赢了?

关于javascript - Bootstrap Accordion 。保留多个面板的页面加载状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251816/

相关文章:

javascript - 样式组件中的响应式数组

JavaScript- "Image not found"除非我刷新页面

JavaScript 幻灯片不工作

javascript - 序列化表单并与ajax数据中的其他值组合

javascript - AngularJS 中的 ng-repeat 未正确绑定(bind)

perl - 有没有办法使用 JSON Perl 模块对对象构造函数进行编码?

javascript - 重定向到另一个页面/路线之前确认

java - Spring DateTimeFormat 不适用于 jQuery UI Datepicker

jquery click 事件不适用于加载 ajax 的 div

Jquery MouseOver 是 DIV 的一部分