添加到浏览器历史记录而不重新加载页面

twi*_*wiz 18 javascript browser url back browser-history

基本上,我有一个包含表单的页面.当用户提交该表单时,将调用Javscript函数并向用户动态显示新表单.

此时,我希望用户能够单击浏览器的后退按钮并返回到第一个表单.这可能吗?


感谢您的快速回复,但我无法让pushState工作.单击后退按钮后,HTML仍显示"第二个表单".

这是我用来测试它的代码:

<script>
function newPage(){
    history.pushState({state:1}, "State 1", "?state=1");
    document.getElementById('formBox').innerHTML="second form";
}
</script>


<input type="button" onclick="newPage();" value="forward" />
<div id='formBox'>first form</div>
Run Code Online (Sandbox Code Playgroud)

Ell*_*lle 26

var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");
Run Code Online (Sandbox Code Playgroud)

与文档相关的链接.

  • @MichaelRobinson(但主要是针对未来的开发人员找到这个答案)这样的功能目前应该被视为一个很好的补充,以提供更好的用户体验.不具备后退选项的不便不会破坏站点,并且可以实现诸如`beforeunload`事件之类的后备.随着浏览器的推进,这应该是正确的答案,因为它是原生的javascript. (5认同)
  • 我知道它来自文档,就像你编写它一样,但是你知道stateObj有什么影响吗?foo的目的是什么:和"bar"? (2认同)
  • @Luke `stateObj` 可以包含您想要的任何内容。当您使用 `history.back()`、`history.forward()` 或 `history.go(target)`(其中 `target` 是整数或完整/部分 url)时,或者如果用户使用浏览器的后退按钮,然后您可以访问该 `stateObj`。例如`window.onpopstate = function(event) { alert(JSON.stringify(event.state));` https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate (2认同)

Mic*_*son 14

我使用History.js完成了HTML5历史/状态API的类似行为,如下所述:

为所有HTML5浏览器提供交叉兼容的体验(它们都有点不同地实现HTML5历史记录API,导致不同的行为,有时还有错误 - History.js修复了这一点,确保在整个HTML5浏览器中体验符合预期/相同/优秀)

例:

History.pushState({state:1}, "State 1", "?state=1");
Run Code Online (Sandbox Code Playgroud)

  • 不是跨浏览器它不是 (4认同)
  • 这是本机JS功能,不需要库. (2认同)