【问题标题】:Keep scroll position and save toggle after page refresh页面刷新后保持滚动位置并保存切换
【发布时间】:2020-02-29 23:15:18
【问题描述】:

长内容子页面有多个“阅读更多”按钮,使用 jquery toggleClass 完成。

当用户单击“阅读更多”按钮时,内容会显示并且页面会刷新。 (由于各种原因,我需要刷新页面)。

当页面刷新时,内容当然不会再展开了。

我想做的是:

  • 在页面刷新之前保存所有展开/折叠切换内容。
  • 在页面刷新之前转到相同的滚动位置。

我不确定保存信息的最佳方式是什么 -> CookiessessionStoragelocalStorage 就我而言,因为用户通常会打开更多带有“阅读更多”按钮的子页面。

我做了一个JSFiddle(页面刷新无法正常工作)。

【问题讨论】:

  • jsfiddle.net/aq10zyku(即使使用“代码”,小提琴链接也无法在问题中使用。)
  • 您能否详细说明一下您的页面以及启动刷新的原因?是aspx页面,php,vanilla html吗?
  • 非常感谢您的参与。请看小提琴。它是前端的 html 页面。

标签: javascript jquery


【解决方案1】:

我建议为此使用sessionStorage

首先,从您的 HTML 中删除所有 onclick=refreshPage()。您希望将所有 JS 代码保留在 JS 中,并将所有处理程序设置在一个地方。作为最佳实践,请不要使用 onclick

接下来,创建两个函数:loadState()saveState()。您需要在每次页面加载(刷新)时调用loadState(),并在每次单击切换按钮时调用saveState()

在单击按钮的处理程序中,还执行页面刷新。

整个JS代码:

$(window).on('load', function() {
  loadState();
});

$('.read-more-toggle').on('click', function() {
  $(this).next('.read-more-content').toggleClass('hide');

  saveState();
  refreshPage();
});

// Fold or unfold each content based on state before refresh
// And go to same scroll position before refresh
function loadState() {
  let hidden_states = sessionStorage.getItem('hidden-states');
  if (!hidden_states) {
    return;
  }
  hidden_states = hidden_states.split(',');
  $('.read-more-content').each(function(i, elem) {
    if (hidden_states[i] === 'hide') {
      elem.classList.add('hide');
    }
    else {
      elem.classList.remove('hide');
    }
  });

  document.scrollingElement.scrollLeft = sessionStorage.getItem('scroll-x');
  document.scrollingElement.scrollTop = sessionStorage.getItem('scroll-y');
}

// Remember fold & unfold states, and scroll positions
function saveState() {
  let hidden_states = [];
  $('.read-more-content').each(function(i, elem) {
    hidden_states.push(elem.classList.contains('hide') ? 'hide' : 'show');
  });

  sessionStorage.setItem('hidden-states', hidden_states);
  sessionStorage.setItem('scroll-x', document.scrollingElement.scrollLeft);
  sessionStorage.setItem('scroll-y', document.scrollingElement.scrollTop);
}

function refreshPage() {
  window.location.reload();
}

注意:如果可能,尽量避免页面刷新。存储视图状态然后在刷新后重新创建它们感觉不是最理想的。在某些浏览器中,它还可能导致在重新绘制恢复的状态时偶尔出现滚动跳转故障。

最后,考虑一下您的项目是否真的需要 jQuery。大多数功能都可以在 vanilla JS 中实现。

【讨论】:

  • 非常感谢您的帮助。我很感激。你在这么短的时间内完成了一项了不起的工作。只有1个问题。当您首先打开页面时,所有内容都会折叠而不是关闭。你能解决这个问题吗?谢谢你:)
  • 我不知道你所说的“折叠而不是关闭”是什么意思。听起来和我一样。在您的代码中,您有一个类hide。术语关闭、隐藏、折叠是否相同?我怀疑您的意思是您希望所有部分默认情况下都处于某种状态(显示或隐藏),但您确实需要在术语上保持一致和精确。无论如何,我相信修复非常简单。我可能会在一分钟内修复它。但你也可以!我不想偷走你的学习成果,所以我希望我的代码已经给了你足够的时间继续下去。
  • 是的,过了一会儿我自己找到了。非常感谢。
猜你喜欢
  • 2013-07-12
  • 2021-04-17
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2012-04-25
  • 2021-07-07
相关资源
最近更新 更多