HTML5 History API 后退按钮,部分页面加载

2023-11-23

为了提高网站的性能/响应能力,我使用 AJAX、replaceState、pushState 和 popstate 侦听器实现了部分页面加载。

我基本上将页面的中心部分(HTML)存储为历史记录中的状态对象。单击链接时,我仅从服务器请求页面的中心位(使用不同的 Accept 标头识别这些请求)并将其替换为 javascript。在 popstate 上,我抓住之前的中心部分并将其推回到 dom 中。

这基本上工作得很好,但是我发现了一个我陷入困境的特定问题。解释起来有点复杂,如果不是很清楚,我很抱歉。

我们的大多数页面上都有一个搜索表单。通过 ajax 进行的部分页面加载仅适用于 GET 请求,而表单执行 POST 会导致完整页面加载。

如果我导航以下一组页面,我最终会看到一个格式错误的部分页面,其中包含ONLY中心内容,没有任何周围的 dom:

从主页开始(通过整页加载)- 执行搜索(重定向后获取)
带您进入搜索结果(通过整页加载) - 然后单击“主页”
返回主页(通过动态获取) - 单击浏览器返回
搜索结果(来自 popstate 侦听器)- 单击浏览器后退
主页格式错误。

当出现格式错误的主页时,我的 popstate 侦听器根本不存在。

What I think发生的情况是,主页的第二次加载(动态、部分)被浏览器缓存,然后当发生完整页面返回时,浏览器仅显示缓存的部分响应而不是完整页面。

为了尝试解决此问题,我在响应中添加了 Vary: Accept 标头,让浏览器知道内容可能会根据接受标头而更改。我还向部分加载的内容添加了 Cache-Control max-age=0、pragma no-cache 和过去的到期日期,以尝试强制浏览器不缓存此内容,但这些都无法解决问题。

不幸的是,我的公司不允许外部流量到达我们的开发服务器,所以我无法向您展示问题。我在这里查看了各种类似的问题,但它们似乎都不完全相同,建议的解决方案似乎也不起作用。

如果我在动态 GET 请求中添加一个无意义的参数 (blah=blah),就可以解决问题。然而,这是一个丑陋的黑客,我宁愿不这样做。这似乎应该可以通过标头解决,因为我认为这是一个缓存问题。谁能解释一下发生了什么事吗?


那是一个缓存问题。将响应标头 Cache-Control 设置为no-cache or max-age=0,这个问题在FF中不会发生(正如你所说),但在Chrome中仍然存在。

对我有用的标头是 Cache-Control:no-store。这并不是所有浏览器都一致实现的(您可以找到询问无缓存和无存储之间有什么区别的问题),但在 Chrome 中也能得到您期望的结果。

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

HTML5 History API 后退按钮,部分页面加载 的相关文章

  • 为整个网站设置单个图标

    目前我正在使用这段代码将网站图标添加到网站 但是 必须将此代码添加到每个 HTML 页面中 有谁知道如何设置全局图标 我看过的所有地方都告诉我必须将其添加到每个页面 UPDATE Chrome 在根目录中搜索 favicon ico 文件
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • Jquery,清除/清空 tbody 元素的所有内容?

    我认为这会相当简单 但似乎空方法无法清除我拥有的 tbody 如果有人知道执行此操作的正确方法 我将不胜感激 我只想删除 tbody 中包含的所有内容 到目前为止我正在尝试 tbodyid empty HTML table tbody tr
  • 加载另一个 JS 脚本后加载

    这是我的代码 very big js file lots of html stuff 问题是 这些是异步加载的 有没有办法等待第二个脚本直到第一个脚本加载 如果您使用 jQuery 有一个非常简单的方法可以通过获取脚本 https api
  • span 和 iframe 正文中的宽度(以像素为单位)

    我需要知道 a 的宽度 nbsp 以像素为单位 以及是否取决于字体大小 另外 页面中不同元素的情况是否有所不同 还有 就是 nbsp 与常规不同 目的 nbsp 不间断空格 位于正常空格之上是为了防止单词之间出现换行 您可以使用多个 nbs
  • JQuery 可搜索下拉框

    我有一个可搜索列表 是使用 JQuery 插件创建的 http plugins jquery com searchit http plugins jquery com searchit 但我希望当列表框第一次出现时默认选择一些值 即使我在选
  • IE 位置问题:绝对

    我有这段代码 它在 Firefox 中运行得很好 但在资源管理器上会向右射击 这段代码有什么我看不到的问题吗 感谢您的帮助 div a href http www mysite com img src images sponsor png
  • 在chrome中将pdf渲染为iframe

    我正在尝试将 pdf 托管在隐藏的 iframe 中 但在 Chrome 中呈现较小的问题时遇到问题 我必须刷新页面才能正确加载 JSfiddle 在这里https jsfiddle net 464xo40f https jsfiddle
  • 如何以编程方式禁用 元素上的自动选择?

    然后用户使用 TAB 或 SHIFT TAB 跳转 到某个文本框 并且该文本框恰好有一个值 那么该值将被自动选择 我想禁用此行为 我认为这可以在 focusin 事件处理程序内部完成 input text focusin function
  • 如何在购物车中显示自定义属性(Magento)

    我尝试了很多东西 但没有一个起作用 我想我可以在产品页面上获取自定义属性 但我想知道 如何在购物车页面中获取它们 属性只是简单的文字 item gt getProduct gt load 将从数据库重新加载所有产品数据 虽然这可行 但请记住
  • 数据库中的 HTML 标签是不好的做法还是好的做法?

    有时我需要格式化来自数据库的特定数据或部分数据 例如 如果我有这样的 desc 存储在数据库中 HTML 4 经过调整 延伸和增强 超出了其最初的范围 为网站带来了高水平的交互性和多媒体 Flash Silverlight 和 Java 等
  • 在 HTML 中,

    应该以哪种方式嵌套?

    是否有更正确的嵌套顺序 a and h1 HTML 中的元素 e g a href www example com h1 Example h1 a or h1 a href www example com Example a h1 在 HT

  • Selenium driver.page_source() 仅提取部分 HTML DOM

    我有一个网页 当我右键单击它然后查看页面源时 我得到 SECTION A 但是当我点击它然后检查时 我得到了更长的输出 我尝试使用 JS 获取页面源 但同样的问题 我得到了输出SECTION A 我怎样才能解决这个问题 注意 我正在寻找通用
  • YouTube 360​​ 视频 iframe 无法在移动浏览器中工作

    我正在尝试为 YouTube 360 视频获取嵌入的 iframe 以便在我的移动网站上播放 它在桌面浏览器上运行良好 但在移动浏览器中我只能播放平面立体视图 我可以确认它绝对是一个 HTML5 播放器 这显然是其他人正在经历的一个未解决的
  • 计算div中有多少个元素

    我有一个div 里面有span 有没有一种方法可以计算 div 中有多少个元素 然后将其作为值给出 例如 一个 div 中有 5 个跨度 那么它会对其进行计数并发出警报 5 请使用 JavaScript 谢谢 如果你想要后代的数量 你可以使
  • 如何在 的每四个循环项之后添加

    我想在循环中的每第四个数字项之后退出循环 我想创建一个二十人的名单 在每一个tr应该是4个人 So I want to break from the loop after every 4th number of loop My one tr
  • 如何在 html 画布上使文本适合精确的宽度?

    如何在 html5 画布上将单行文本字符串调整为精确的宽度 到目前为止我尝试过的是以初始字体大小编写文本 测量文本的宽度measureText my text width 然后根据我想要的文本宽度和实际文本宽度之间的比例计算新的字体大小 它
  • 如何在没有查询参数的情况下重新加载页面?

    假设我想重新加载www domain com abc num 4 但我想重新加载www domain com abcONLY 问号后没有所有内容 window location window location href split 0
  • 恢复默认的CSS属性

    我正在编写一个可在多个网站上使用的组件 每个网站都有自己的样式表 并且以不同的方式显示某些内容 我的所有 html 都包含在一个带有 id 的 div 中 div div 然而 我的组件是在所有网站上看起来一致 这很好 因为我将样式应用于组
  • 为什么插入符号在具有position:relative的contenteditable中不可见?

    When a contenteditable元素有position relative和背景颜色 插入符号放置在该元素中时是不可见的 这是一个例子 bug position relative background color lightgre

随机推荐

  • .NET 中的自定义文化感知日期格式

    在 NET 中 用于格式化 DateTime 值的大多数标准字符串都是区域性感知的 例如 ShortDatePattern d 格式字符串根据当前区域性切换年 月 日部分的顺序 6 15 2009 1 45 30 PM gt 6 15 20
  • PHP 作为 FastCGI 应用程序运行 (php-cgi) - 如何发出并发请求?

    编辑 更新 向下滚动 编辑2 更新 问题已解决 Some background information 我正在用 Java 编写自己的网络服务器 几天前我询问 Apache 与 PHP 的接口到底如何 这样我就可以实现 PHP 支持 我了解
  • .NET 中工作线程和 I/O 线程的简单描述

    在 NET 中很难找到工作线程和 I O 线程的详细但简单的描述 我对这个主题的了解很清楚 但技术上可能不准确 工作线程是这样的线程should使用 CPU 来完成工作 I O 线程 也称为 完成端口线程 should使用设备驱动程序来完成
  • 如何在 Numpy/MatplotLib 中可视化线性规划(具有任意不等式)的可行区域?

    我需要实现线性规划问题的求解器 所有限制都是 5x 10y 这些限制可以是任意数量的 另外 x gt 0 y gt 0 隐式 我需要找到最佳解决方案 最大值 并在 matplotlib 中显示可行区域 我通过实施单纯形法找到了最佳解决方案
  • Unwind Segue 在 Swift 3 和 iOS 10 中不起作用

    我正在尝试在 iOS 10 和 Swift 3 中测试 unwind segue I made a simple app like this 我添加了 segue 的代码TableViewController类并连接 取消 按钮并退出表视图
  • 从文本文件中删除^M字符的Shell命令[重复]

    这个问题在这里已经有答案了 可能的重复 删除 Unix 中的回车符 我正在读取外部第三方生成的一些数据 我注意到文件中的 ASCII 文本中散布着 M 字符 我认为这是 ASCII 中的字符 13 表示不带换行符的回车符 是否有一个行可以用
  • 如何在android中使用SharedPreference存储图像?

    我想使用 SharedPreference 在 android 中保存图像 我有两个活动类 当我单击第一个活动的按钮时 它将调用第二个活动 第二个活动在列表视图中显示我的首选名称 并将 Android 壁纸重置为我设置为首选壁纸的图像在第一
  • 将字符串列表作为 Airflow 中相关任务的参数传递

    我正在尝试通过以下方式将字符串列表从一个任务传递到另一个任务XCom但我似乎无法将推送列表解释回列表 例如 当我在某些函数中执行此操作时blah这是运行在ShortCircuitOperator paths gs format bucket
  • 获取 SoundCloud API 客户端 ID

    从浏览器访问我的轨迹时遇到问题 通常我在浏览器中输入此链接来访问可下载的曲目 http api soundcloud com tracks 294324164 download client id 02gUJC0hH2ct1EGOcYXQI
  • 将 google adsense 与 React + React Router 结合使用

    我正在尝试将 Google Adsense 集成到我的 React 网站中 但遇到了问题 为了在我的网页上投放广告 我已将此脚本标记包含在head我的 html 文件 这些广告被包装在一个简单的组件中 如下所示 export default
  • 关于使用 std::less 和 std::greater 与 std::sort 的混淆

    在C语言中 排序通常实现如下例 include
  • 为什么 NaN 不是有限的?

    测试isFinite函数我看到NaN is an infinite数 即使是不是一个数字 isFinite NaN returns false 这背后的逻辑是什么 为什么不是NaN finite 正如戴夫 牛顿所说 NaN 不是一个数字 然
  • Jenkins Gradle 集成:调用 Gradle 与使用 Gradle Wrapper 选项

    我刚刚开始在我的项目中使用 Jenkins for CI 和 Gradle 构建工具 I found 使用 Gradle 和 Jenkins 构建持续交付管道我不明白为什么作者建议 始终使用包装器 c 编号 120幻灯片 为什么这比直接涉及
  • 在全局范围内重新定义指针

    In 这个问题我对 C 的这个看似基本的方面感到非常困惑 考虑这两行代码 int ptr ptr 2 gcc 将发出以下警告 main cpp 4 1 warning data definition has no type or stora
  • Google 地图 API v3 放置搜索 - 将另一个参数传递给回调函数

    我正在使用 Google 地图地方 API v3 返回许多 类型 的地点 每个地点由地图上的不同标记表示 我创建一个 google maps places PlacesService 对象 然后为每个地点类型调用一次 搜索 方法 每次 我都
  • 异步任务 获取 VS HttpResponseMessage 获取

    我需要您在以下方面提供帮助 近一个月来 我一直在阅读有关 Tasks 和 async 的内容 我想尝试在一个简单的 Web API 项目中应用我新获得的知识 我有以下方法 并且它们都按预期工作 public HttpResponseMess
  • 如何在 PHP 中解析和处理 HTML/XML?

    如何解析 HTML XML 并从中提取信息 Answer recommended by PHP Collective 原生 XML 扩展 我更喜欢使用其中之一原生 XML 扩展因为它们与 PHP 捆绑在一起 通常比所有第 3 方库更快 并为
  • 比较 android 中的语音 wav 或语音标签(语音命令)API

    我正在开发一个应用程序 我需要某种方法来比较两个语音是否匹配 我知道语音识别器是一种方法 但因为 我认为 它需要首先将语音转换为字符串 所以除了语音识别器支持的语言之外 不太适合其他语言 有什么想法吗 就像过去的电话一样 语音标签只是将语音
  • 用 C 语言模仿 Python 的 strip() 函数

    我最近开始用 C 语言开发一个小玩具项目 并且一直在摸索模仿 python 字符串对象的 strip 功能的最佳方法 阅读 fscanf 或 sscanf 发现字符串被处理到遇到的第一个空格 fgets 也没有帮助 因为我仍然有换行符 我确
  • HTML5 History API 后退按钮,部分页面加载

    为了提高网站的性能 响应能力 我使用 AJAX replaceState pushState 和 popstate 侦听器实现了部分页面加载 我基本上将页面的中心部分 HTML 存储为历史记录中的状态对象 单击链接时 我仅从服务器请求页面的