js中能获取之前的历史状态对象吗?

2024-01-10

当我点击后退或前进按钮并且 popstate 事件触发时,我可以获得前一个状态的状态对象吗?因为不是 e.state 提供的状态对象,而是我刚刚后退/转发的状态对象?

或者,我可以检测按下的是后退按钮还是前进按钮?

我需要这个,因为我有多个子系统,它们都需要同时使用 js 历史记录,当然,我可以在推送时保存所有子系统的状态,但是,当我弹出时,我必须将状态恢复到所有子系统这也是不需要的,因为它重置了我不需要的对象。例如

state 1 = {a:1, b:1, c:1}
push a = 2
state 2 = {a:2, b:1, c:1}
hit back button, popstate fires state 1 to me
restart a with 1, b with 1, c with 1 while I only need to restart a

另类幻想解决方案

....
hit back button, popstate fires state 1 to me
I also get state 2 (the one I just moved away from) through some black magic
do a differential comparison between the 2 states, find out that I only need to modify a
restart a with 1

编辑:哦,还要澄清一下,没有简单的方法可以检查页面上当前的状态 a、b 和 c (因为它比 abc 和 123 更复杂一些)


答案是装饰pushState记录应用程序中的当前状态。所以,像这样:

var app = {
    currentState: false,
    originalPushState: false,

    pushState : function(state, title, href) {
        app.currentState = state;
        app.originalPushState.call(history, state, title, href);
    },

    onPopstate : function(event) {
        var newState = event.state;
        var oldState = app.currentState;
        app.currentState = newState;

        // you now have the current state and the state you came from
    },

    init : function() {
        window.onpopstate = app.onPopstate;
        app.originalPushState = history.pushState;
        history.pushState = app.pushState;
    }
}
app.init();

作为旁白,popstate相当混乱。当您弹出常规数组时,您会得到弹出的值,而不是现在位于其末尾的值,因此从语义上讲,它有点奇怪。此外,history.state总是包含当前状态,所以event.state是多余的。我想说,设计师的奇怪选择,如果有的话更明智event.popped是指向实际弹出的页面状态的指针(可能仅当它与您的站点位于同一域中时才可用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js中能获取之前的历史状态对象吗? 的相关文章

随机推荐

  • 读取启动盘上的扇区

    这是我的问题的延续读取超级块 https stackoverflow com questions 339795 reading the superblock 假设我想以 Mac OS X 中的 HFS 文件系统为目标 我如何读取启动盘的第
  • 以编程方式更改 Windows 10 锁定屏幕背景(在桌面上)

    如何以编程方式更改 设置锁定屏幕背景图像 使用 VB NET C 或 Visual C 我使用的是 Win 10 Pro 并拥有 Visual Studio 2017 Pro 我在网上查了一下 但大多数解决方案似乎都不起作用 例如 Both
  • Achartengine - Android 中条形图的不同条形颜色

    我在 android 中使用创建了一张图表图表引擎 http achartengine org图书馆 我想用不同的颜色显示每个栏 我能做什么 请给我一些建议 提前致谢 只需查看给出的答案here https stackoverflow co
  • 在 django 中使用 Crispy_forms 时,“FormHelper”对象没有属性“append”

    我是 Django 的新手 我正在尝试使用脆脆的表单来设计表单的样式 我的应用程序中有一个表单 它恰好是一个模型表单 我已经遵循了此处所说的内容https stackoverflow com a 13201588 1076075 https
  • Laravel 5.x 数据库触发器和可能的最佳实践

    这篇文章的目的是提供信息并提出问题 大家好 我正在开发一个可以充分利用触发器的大型系统 我们目前正在使用 phpmyadmin 在 Laravel 5 2 和 php 7 上运行服务器端 在 Laravel 中 并没有太多关于如何通过迁移使
  • 概括 python 脚本以在目录中的所有文件上运行

    我有以下 python 脚本 with open ein csv r as istr with open aus csv w as ostr for line in istr line line rstrip n 1 print line
  • 这是一个指针吗? (如果是的话,它是如何初始化的?)

    有一个头文件 esUtil h 其中定义了一个名为 ESContext 的结构 其成员之一是 userData userData 是一个指向 void 的指针 使用它的程序主体如下 include esUtil h typedef stru
  • Facebook Connect for iOS:dialogDidComplete 响应区分

    我想知道如何区分用户在内联后流 FBDialog 中点击 提交 或 跳过 有谁知道要测试什么吗 我在 iOS 4 2 环境中使用最新的 iOS Facebook Connect Called when a UIServer Dialog s
  • 再次重新处理/读取Kafka记录/消息 - Consumer Group Offset Reset的目的是什么?

    我的 kafka 主题总共有 10 条记录 消息 2 个分区 每个分区有 5 条消息 我的消费者组有 2 个消费者 每个消费者已经分别从其分配的分区读取了 5 条消息 现在 我想从开始 开始 偏移量 0 重新处理 读取我的主题中的消息 我停
  • 带注释的收藏袋

    我正在观看一个由 制作的精彩视频伯特 贝克威斯 http www infoq com presentations GORM Performance http www infoq com presentations GORM Performa
  • 无法检索 Eclipse 插件中选定的 java 文件名/路径

    我正在开发一个插件 需要 检索 java 文件的路径 文件名 我编写的代码成功检索了 xml 或清单文件的文件名 路径 但无法检索包中 Java 文件的路径 我使用的代码是 if IStructuredSelection 的选择实例 Obj
  • 如何在Vue JS中动态渲染组件?

    我正在制作一个表单生成器 它使用其中的组件作为输入字段 按钮等 我希望能够根据我传递给它的选项来生成表单 但我无法让它渲染组件 我尝试返回纯 HTML 但这不会渲染组件 我从 Home vue 模板中调用表单生成器 我希望表单具有如下所示的
  • 线程池并行处理消息,但保留对话中的顺序

    我需要并行处理消息 但保留具有相同会话 ID 的消息的处理顺序 Example 让我们像这样定义一个消息 class Message Message long id long conversationId String someData 假
  • iOS 7.1 删除超级视图崩溃

    我的应用程序没有发生任何崩溃 直到iOS 7 1出来 现在在任何removeFromSuperview方法 崩溃 例如 我有视图控制器 当我想删除视图控制器时 我删除它的所有子视图 然后从堆栈中删除 堆栈 我在其中存储视图控制器 用于加载新
  • 如何在 AngularJS 中交换 div 元素的顺序?

    如何使用 Angular 的数据绑定更改包含文本框和下拉列表的 div 元素的顺序 div 的顺序应相应更改用户登录意味着如果用户类型为 A 则 div A 应位于顶部 如果用户类型为 B 则 div B 应位于顶部 其他 div 元素将位
  • 无法使用 Firebase CLI 登录

    当我尝试使用 CLI 登录 Firebase 时遇到问题 我安装了firebase tools using npm g install firebase tools具有管理员权限 我执行的步骤是 从 Windows 10 Professio
  • 删除第一页的页眉和页脚

    class MyDocTemplate BaseDocTemplate def init self filename kw self allowSplitting 0 apply BaseDocTemplate init self file
  • 如何借助 FFMPEG 和 PHP 代码连接两个 mp4 视频? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有人可以帮助我使用 FFMPEG 的 php 代码来连接两个 mp4 视频并将连接的文件作为 mp4 存储在服务器中的任何文件夹中吗
  • jQuery 仅序列化 div 中的元素

    我想得到同样的效果jQuery serialize 但我只想返回给定的子元素div 结果示例 single Single2 multiple Multiple radio radio1 没问题 只需使用以下内容即可 这将与序列化表单完全相同
  • js中能获取之前的历史状态对象吗?

    当我点击后退或前进按钮并且 popstate 事件触发时 我可以获得前一个状态的状态对象吗 因为不是 e state 提供的状态对象 而是我刚刚后退 转发的状态对象 或者 我可以检测按下的是后退按钮还是前进按钮 我需要这个 因为我有多个子系