使用 window.history.pushState 函数时无法在“历史”错误上执行“pushState”

Posted

技术标签:

【中文标题】使用 window.history.pushState 函数时无法在“历史”错误上执行“pushState”【英文标题】:Failed to execute 'pushState' on 'History' error when using window.history.pushState function 【发布时间】:2014-08-17 00:47:01 【问题描述】:

我在 javascriptMVC 应用程序中使用window.history 为每个控制器启用后退/前进/刷新功能。每次我加载一个新控制器时,我都会使用window.history.pushState 向历史记录添加一个新状态。然后在返回/刷新时,我使用保存的状态并重用数据来再次构建控制器。

除了特定场景中的一个问题外,整个想法都很好。我收到以下错误:

无法在“历史记录”上执行“pushState”:一个对象不能被 克隆。

在其他情况下添加相同的数据没有问题。什么会导致此错误? 感谢您的帮助。

【问题讨论】:

【参考方案1】:

window.history.pushState 字符串大小限制为 640k 个字符

最好切换到localStoragesessionStorage

来源:https://developer.mozilla.org/en-US/docs/Web/API/History/pushState

【讨论】:

【参考方案2】:

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

“状态对象可以是任何可以序列化的对象。因为 Firefox 将状态对象保存到用户的磁盘中,以便在用户重新启动浏览器后可以恢复它们,所以我们对序列化表示的state 对象。如果您将序列化表示大于 this 的 state 对象传递给 pushState(),该方法将抛出异常。如果您需要比这更多的空间,建议您使用 sessionStorage 和/或 localStorage。"

看起来简单的答案是您传入的状态可能是序列化到大于 640k。我刚刚遇到了这个错误,我几乎可以肯定这就是原因。

【讨论】:

感谢您的回复。这个问题是由我试图保存和序列化的对象中的一些循环依赖引起的。在我删除循环依赖后,它就解决了。 我遇到了同样的问题,因为我将 DOM 元素传递给状态对象。不是一个好主意。感谢您的回答:真的很有帮助。 使用 Knockout 时遇到同样的错误,因为我没有取消对 observable 的引用 - 在我应该推送 ID() 时尝试推送 ID

以上是关于使用 window.history.pushState 函数时无法在“历史”错误上执行“pushState”的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)