在浏览器上哪些情况可能导致 window.history.state 为空?

2024-01-07

我的网站的查询字符串 URL 如下:

?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1

当用户转到下一页(从第 1 页到第 2 页)时:

  1. 我们明确增加pn(页码加 1)并将其设置在查询字符串 URL 中。

    更改后的查询字符串:

    ?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=2
    

    我还存储了旧的查询字符串,它看起来像:

    ?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
    
  2. 然后,我将两者推送到窗口历史记录以更改 URL 并保存以前的内容供浏览器返回:

    window.history.pushState(oldQS, null, newQS);
    
  3. 完成此操作后,当我在第 2 页时,IN 检查window.history.state。它存储我之前的状态:

    ?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
    
  4. 我从 page2 按回浏览器返回到 page1。我在以下位置设置了断点:

    $(window).on('popstate', function(e) {
        console.log(e.originalEvent.state)
    });
    

    e.originalEvent.state is null.

观察结果:

  • The window.history.state is not null当我在第 2 页时,并存储正确的值。
  • It gets null当我单击浏览器返回时的值。

到目前为止我所做的:

(还没有工作。)

  • 放置断点hashchange事件,但没有帮助,因为 URL 中没有 #。

  • 在每个上设置断点window.history在我的 Javascript 代码上运行,例如pushState(), replaceState()但当我按下浏览器时,所有这些都没有受到影响。

我不知道其他所有地方/功能可能会发生变化window.history.state to null.

我怎样才能通过单击浏览器后退来找出它是如何以及在哪里变成空的?


你问:

我不知道其他所有地方/函数可能会将 window.history.state 更改为 null。

我怎样才能通过单击浏览器后退来找出它是如何以及在哪里变成空的?

我们来读一下 W3C HTML5 规范:

5.5.2 历史记录界面 https://www.w3.org/TR/html5/browsers.html#the-history-interface

...

History 接口的状态属性必须返回用户代理设置的最后一个值。最初,它的值必须为空。

结论:当文档加载时,history.state最初是null.

5.6.10 历史遍历 https://www.w3.org/TR/html5/browsers.html#history-traversal

当需要用户代理遍历历史记录到指定条目时,[...],用户代理必须执行以下操作。

...

  1. 如果该条目是状态对象条目,则令 state 为该状态对象的结构化克隆。否则,令 state 为空。

...

  1. 如果指定条目的 Document 具有最新条目,并且该条目不是指定条目,则将状态更改为 true;否则就让它为假。

...

    1. 如果 statechanged 为 true,则使用 PopStateEvent 接口在 Document 的 Window 对象上触发名为 popstate 的可信事件,并将 state 属性初始化为 state 的值。 [...]

结论:当导航回到文档加载时的状态时,该状态触发了popstate事件是null.

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

在浏览器上哪些情况可能导致 window.history.state 为空? 的相关文章

  • .getDay() 奇怪的行为[重复]

    这个问题在这里已经有答案了 有一个例子 console log new Date 2013 02 24 getDay 24 gt 0 24 console log new Date 2013 02 25 getDay 25 gt 1 25
  • 自定义过滤器在 Angular Hybrid 应用程序中不起作用

    我正在尝试将 AngularJS 1 6 应用程序与 Angular 5 一起转换为混合应用程序 我定义了以下简单过滤器 function use strict var filterId colorPicker angular module
  • 当容器有选择框时 jQuery mouseleave 触发问题

    我有两个容器 一个嵌套在另一个容器内 当我将鼠标悬停在父容器上时 我希望显示子容器 当我鼠标移出时 我希望子容器淡出 我遇到的问题是子容器有一个包含 选择框 的表单 当用户选择选择框时 会意外触发 mouseleave 事件 如何阻止选择框
  • JSONP 回调失败,需要 javascript/jquery 帮助

    我是 json 的菜鸟 了解一点 jquery 并尝试让一个小脚本工作 我想检索某个纬度 经度的时间 并根据我在网上阅读的内容编写了这个脚本 getJSON http ws geonames org timezoneJSON lat 47
  • Node.JS Web 服务器中的安全性

    所以 我正在学习 Node JS 到目前为止我很喜欢它 我已经有几个项目在工作了 我想我可以在其中使用nodejs 不过 我担心安全问题 如果我使用 Node JS http 模块编写自定义 Web 服务器 我是否可能非常容易受到攻击 Ap
  • 如何使 Loopback 模型事件起作用?

    我尝试过一个例子http apidocs strongloop com loopback model http apidocs strongloop com loopback model MyModel on changed functio
  • 删除 CSS Transitionend 事件侦听器不起作用

    我在尝试删除 css Transitionend 事件侦听器时遇到问题 我可以添加监听器 e addEventListener transitionend function event transitionComplete event pr
  • JavaScript 中的自定义“确认”对话框?

    我一直在开发一个使用自定义 模式对话框 的 ASP net 项目 我在这里使用吓人引号 因为我知道 模式对话框 只是我的 html 文档中的一个 div 它被设置为出现在文档其余部分的 顶部 而不是真正意义上的模式对话框 在网站的许多部分
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • Primeng 时间表与 Angular2 webpack

    我将使用 Primeng 时间表 http www primefaces org primeng schedule http www primefaces org primeng schedule 在基于 Angular2 webpack
  • 如何检查 URL 末尾是否有特定字符串

    我需要根据 URL 末尾的内容让覆盖层向下滑动 如果 URL 末尾有 faq 覆盖层下降 如何在 jQuery JavaScript 中做到这一点 如果您的网址看起来像这样http yourdomain com faq 你可以这样做 var
  • 动态多个延迟 jQuery Ajax 调用

    使用 jQuery 的延迟模式http api jquery com jQuery when http api jquery com jQuery when 我正在尝试进行多个 jsonp ajax 调用并等待结果 然后再进行下一步 我可以
  • ajax - 检查用户名是否存在+如果存在则返回消息

    我试图检查用户想要的用户名是否已被使用 而无需发送表单 基本上是用户名字段的模糊 我遇到了一些麻烦 有几个问题 我有我的输入字段加上js
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • Rails 6 webpack 抛出“未捕获的引用错误:$未定义”

    大家好 我最近开始使用 ruby 2 6 5 开发 Rails 6 由于 Rails 6 引入了 webpack 所以我尝试使用 webpack 加载我的 js 文件 尽管我已经在 appliation js 中需要了 jquery 但我仍
  • 如何使用 Browserify 获取 html 模板

    我正在尝试找出一种简单的方法 在脚本中需要 html 模板 然后从 CLI 运行 browserify 假设我想获取一个模板并将其附加到正文中 index js var template require template html docu
  • CasperJS:如何单击所有选定的按钮?

    我正在尝试使用 CasperJS 作为网络抓取工具 并且有一个带有按钮的页面 单击该按钮将加载数据 因此 我想先单击所有这些按钮 然后等待 然后再实际进行查询以获取所有必要的数据 问题是对于 Casper casper thenClick
  • 错误:Javascript 上的 [object Object]

    当我在 Firebug 中运行下面的 javascript 时 我不断收到错误 我已经尝试更改多项内容 但它仍然输出错误 我正在使用 api 从 XML 检索信息 然后将其输出到屏幕上 但我不断收到对象错误 有人能看出为什么吗 任何帮助表示
  • 将 jQuery 与 Batman.js 结合使用

    我正在尝试使用 Batman js 并且我想将 jQuery 与它一起使用来实现一些标准的 Ajax 和动画功能 我正在按照位于的安装说明进行操作http batmanjs org download html http batmanjs o
  • angular-cli:Karma-Webpack 因“没有此类文件或目录”而失败

    我从Tour of Heroes使用标准 Angular systemjs 现在我正在使用angular client它在开发 生产模式下运行顺利 但我无法测试任何东西ng test 以下内容会被吐出 不仅适用于test ts但也为了pol

随机推荐