【问题标题】:I'm trying to get the user's browser to "remember" which portion of a collapisble menu was open when they last visited a page and then reopen it我试图让用户的浏览器“记住”他们上次访问页面时打开了可折叠菜单的哪个部分,然后重新打开它
【发布时间】:2021-05-21 22:48:02
【问题描述】:

我使用materializecss 框架制作了前端(HTML)。我正在使用他们的Collapsible 元素,单击时会展开。

在某些元素中是表单,提交后会触发网页的刷新。页面重新加载后,可折叠元素全部折叠。此外,当用户离开页面然后返回时,所有元素都会折叠。

我正在尝试找到一种方法来“记住”哪个元素是打开的。我在想最好将当前打开的元素存储在本地内存中,然后在重新加载时使用访问权限,然后使用他们的 .open() 方法....但我不知道如何在本地存储上执行此操作.

编辑:

添加我当前使用本地存储的尝试

html


  <ul class="collapsible">
    <li>
      <div class="collapsible-header">first tab header</div>
      <div class="collapsible-body"><span>first tab body</span></div>
    </li>
    <li>
      <div class="collapsible-header">second tab header</div>
      <div class="collapsible-body"><span>second tab body</span></div>
    </li>
  </ul>

javascript

<script>

function activate(n){
  //open collapsible element, the tab # being the variable passed in
  $(".collapsible").open(n)
}
function storeElem(n){
  window.localStorage.setItem('openElem', n)
}

$(document).ready(function(){    
    var instance = M.Collapsible.init(elem, {
      accordion: false,
      onOpenStart: storeElem(n)
    });
    var previousElem = window.localStorage.getItem('openElem')
    if (previousElem) {
      activate(previousElem)
    }
})
</script>

【问题讨论】:

  • localStorage 是正确的方法。显示您尝试过的内容。
  • 编辑帖子以添加我当前的尝试。

标签: javascript html materialize


【解决方案1】:

onOpenStart 的参数必须是要调用的函数。否则,您将在初始化手风琴时调用它,而不是在事件发生时调用它。此外,您在调用中使用了未定义的变量n

使用.index() 获取被打开元素的位置。

$(document).ready(function(){    
    var instance = M.Collapsible.init(elem, {
      accordion: false,
      onOpenStart: function(li) {
        storeElem($(li).index());
      }
    });
    var previousElem = window.localStorage.getItem('openElem')
    if (previousElem) {
      activate(previousElem)
    }
})

【讨论】:

  • 我已经尝试过了,并且还添加了几个不同的变体,但没有成功。看起来 onOpenStart 函数没有运行。我添加了一个 console.log('string') 并且它没有执行。 Accordian:false 也不起作用。我已经检查了语法错误/错别字,完全删除了我的并粘贴了你的版本。元素是我正在尝试查看 materialize 的文档,但很难找到答案;可能应该选择一个不同的框架,因为我不是很有经验。
【解决方案2】:

尝试将数据写入本地存储,然后在页面加载时读取它。

静态数据

 const LOCALSTORAGE = {
        COLLAPSED_INDEX: 'project-name-is-collapsed-state',
    };

主要逻辑

class Collapsible {
    _instance = null;

    // ---> Getters
    _getLocalIndex() {
        const collapsedIndex = localStorage.getItem(LOCALSTORAGE.COLLAPSED_INDEX);
        return collapsedIndex;
    }

    // ---> Setters
    _setLocalIndexByElement(element) {
        const index = $(element).index();
        this._setLocalIndex(index);
    }
    
    _setLocalIndex(index) {
        localStorage.setItem(LOCALSTORAGE.COLLAPSED_INDEX, index);
    }

    // ---> Events
    _onOpenStart(element) {
        this._setLocalIndexByElement(element);
    }

    // ---> Actions
    init() {
        this._setupInstance();
        this._setupActiveTab();
    }

    _setupInstance() {
        this._instance = M.Collapsible.init(elem, {
            accordion: false,
            onOpenStart: this._onOpenStart,
        });
    }

    _setupActiveTab() {
        const index = this._getLocalIndex();

        if (index === undefined) {
            return;
        }

        this._openByIndex(index);
    }

    _openByIndex(index) {
        if (this._instance === null) {
            return;
        }

        this._instance.open(index);
    }
}

初始化

function onDocReady() {
    const collapsible = new Collapsible();
    collapsible.init();
}

$(document).ready(onDocReady);

【讨论】:

  • 他有多个手风琴,他需要知道哪个是打开的。
  • 更新了多个可折叠元素的帖子
猜你喜欢
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2013-05-06
  • 2016-11-27
  • 2014-01-06
  • 2012-12-24
  • 2019-05-27
  • 2021-02-17
相关资源
最近更新 更多