试图理解历史 API,下面的 Mozilla 解释向我建议,即使您推送到历史的 url 在服务器上并不真正存在,来自外部源的后退按钮单击将返回 pushState 调用的原始页面制作:
假设http://mozilla.org/foo.html执行以下 JavaScript:
var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");
这将导致 URL 栏显示http://mozilla.org/bar.html,但不会导致浏览器加载 bar.html 甚至检查 bar.html 是否存在。
现在假设用户现在导航到 google.com,然后单击返回。此时,URL 栏将显示 ...mozilla.org/bar.html,并且页面将获得一个 popstate 事件,其 state 对象包含 stateObj 的副本。页面本身看起来像 foo.html,尽管页面可能会在 popstate 事件期间修改其内容。
如果我们再次单击返回,URL 将变为 ...mozilla.org/foo.html,并且文档将获得另一个 popstate 事件,这次是一个空状态对象。在这里,返回也不会改变上一步中的文档内容,尽管文档可能会在接收到 popstate 事件后手动更新其内容。
我在一个 MVC 项目中创建了一个测试页面,它实际上只是将按钮单击与上面示例中的 2 行 javascript 相关联。正如预期的那样,单击该按钮将浏览器位置从 localhost 更改为 localhost/bar.html,并且后退和前进按钮按预期工作。但是如果我然后导航到谷歌并按下后退按钮,我会收到 404 服务器错误。我误解了文档吗?以及如何修改代码以使来自外部源的后退按钮起作用,而无需创建实际的“bar.html”?