6

我目前在 HTTP 发布表单和历史推送状态方面遇到了一点问题。

当我的用户提交 POST 表单,example.com/page-1然后单击此页面中的链接时,他们会被重定向到example.com/page-2history.pushstate。JS 脚本只是更改当前 url,将旧的推送到历史记录,然后显示新的内容。这对我来说非常好。

问题:一旦用户开机example.com/page-2手动刷新页面(ctrl+r或刷新按钮),Chromes会提示用户再次提交表单;但是表格实际上已经example.com/page-1存在,没有理由在这个“新”页面中再次询问它。

有没有办法在popstate更改时清除javascript中所有先前提交的数据,以防止浏览器重新发布提示?还是我在历史状态中遗漏了什么?还是浏览器目前还没有很好地实现它?

我只用 chrome 测试了它,因为我没有用其他浏览器实现 pushstate。

4

2 回答 2

1

也许尝试替换状态?看到这个

replaceState()方法_

history.replaceState() 的操作与 history.pushState() 完全相同,只是 replaceState() 修改当前历史条目而不是创建新条目。

当您想要更新当前历史条目的状态对象或 URL 以响应某些用户操作时,replaceState() 特别有用。

于 2012-12-14T21:33:51.680 回答
1

我有一个相同的问题 - 我正在使用带有BackboneJS的 History API 。

我想到的解决方案是有一个中间页面,登录后表单重定向到这个中间页面。这个中间页面的目的是在目标页面之前添加一个非POST页面,这样浏览器就不会提示重新提交表单(并且 Chrome 不会添加多余的条目)。

对于您的示例,在服务器中提交 POST 表单后example.com/page-1,应将用户重定向到example.com/page-1a

example.com/page-1a可以验证用户凭据是否存在,然后重定向到example.com/page-2. 我相信这会解决你的问题。

对于重定向机制,我可以想到 3 个选项:

  1. 服务器端重定向
  2. JavaScript ( location.href="page-2")
  3. HTML 标头 ( <meta http-equiv="refresh" content="0; URL='http://example.com/page-2'" />)

就我个人而言,我尝试过选项 1 和 2 - 它们对我来说效果很好。希望这可以帮助!

于 2017-09-19T03:44:54.987 回答