如何将新的stateObject添加或附加到历史记录中
How to add or append new stateObject to history
我有以下代码将data
保存在当前页面状态。
window.history.pushState({myData: data}, "RandomTitle", '#');
但现在,我还想保存另一个值,即scrollTop
。如果我做
window.history.pushState({scrollTop: scrollTop}, "RandomTitle", '#');
上面的代码将用新的状态替换历史状态,myData
将消失。
问题是,当我的历史状态中有myData
时,我是否可以添加scrollTop
?或者我只需要一开始就把它设置成
window.history.pushState({myData: data, scrollTop: 0}, "RandomTitle", '#');
// To change the scrollTop in history state
window.history.state.scrollTop = $(window).scrollTop();
我在想是否有window.history.state.addObject
之类的函数。
默认情况下,没有history.state.addObject
函数。history.state
包含您推送的对象(没有其他内容)。
您可以推送具有addObject
方法的东西,但这看起来不是一个好主意。如果您希望将更改作为新状态推送到历史记录中,那么每次都必须显式推送该状态。当你推送一个新状态时,你希望避免改变前一个状态,如果你使用相同的状态对象并修改它,就会发生这种情况(即使根据标准,history.state
应该是实际状态数据的克隆)。您应该创建一个新对象(它可能是以前状态的克隆)。
以下是您的操作方法。
window.history.pushState(
Object.assign({}, window.history.state, {scrollTop: scrollTop}),
"RandomTitle", '#'
);
即使历史中没有当前状态(即window.history.state
是undefined
),它也会工作,因为Object.assign
忽略了undefined
自变量。
你也可以使用这个自动化的功能:
function extendHistoryState(){
arguments[0] = Object.assign({}, window.history.state, arguments[0]);
window.history.pushState.apply(window.history, arguments);
}
它的工作原理与pushState
(参数相同)完全相同,只是它还将在新状态中复制以前状态的属性。因此,你可以做的不是以前的代码:
extendHistoryState({scrollTop: scrollTop}, "RandomTitle", '#');
由于您的URL参数在两个pushState方法之间是相同的,因此您实际上是在替换它,而不是在历史记录中添加新的状态。您需要指定一个不同的URL来保持状态数据的独立性,或者组合对象并将其重新分配到状态
- window.location替换并传递URL历史记录条目中的变量
- Javascript历史记录转换为php行
- 浏览器何时记录历史记录
- 输入类型按钮返回历史记录并返回顶部
- HTML5历史记录-返回上一个完整页面按钮
- asp.net网站文件下载历史记录
- 使用Ajax的后退按钮历史记录,URL中没有散列
- 历史记录和通过JavaScript修改的HTML
- Javascript:历史记录未加载页面
- 通过js设置页面历史记录和页面内容
- 如果没有历史记录,我如何隐藏图像或按钮onclick=;历史.go(-1);
- 将HTML表单发布到iframe会导致浏览器历史记录出现问题
- 如何防止浏览器在历史记录中缓存HTML
- 如何将新的stateObject添加或附加到历史记录中
- 检查浏览器后退按钮历史记录
- React-router 在添加历史记录后不会渲染组件
- 如何返回可用的历史记录状态数
- 引导选项卡不适用于历史记录.返回选项
- 记录 iframe 的历史记录
- 计算历史记录中的页数