history.pushstate没有更新标题

时间:2012-12-11 09:59:39

标签: javascript ajax browser-history

我正在使用AJAX加载页面的主要内容。使用history.pushstate(Object:State, String:Title, String:URL) - 我可以更新地址栏中的网址并导航回历史记录。

title参数似乎无效。窗口标题也不会改变,也不会改变“历史列表”中条目的标题(无论如何它们都可能相同)。

我做错了什么?

更新:Chrome中只会忽略title param。 http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-June/026827.html

2 个答案:

答案 0 :(得分:10)

title参数不是窗口标题 它可以用作国家的标题但是 某些浏览器(如 Chrome )只是忽略它。

答案 1 :(得分:3)

由于@ ujjwal-singh已经在他的回答中写道,第二个参数title可以用作历史中条目的标签,但它是可选的,浏览器可以忽略它并决定使用不同的标题的来源。 note below bullet point 8 at chapter 5.5.2 of the HTML 5 specification

  

title纯粹是建议性的。用户代理可以在用户界面中使用标题。

这就是Chrome和Firefox的工作方式。因此,以下代码应该可以在所有主流浏览器中实现一致的用户体验

document.title = myTitle;
history.pushState( myState, myTitle, myURL );

此代码还会更新文档的标题,Chrome和Firefox应该使用此文档。

然而,无法按预期工作,您将遇到一个奇怪的一个一个错误。 (对于版本低于45和Chrome 51的FF,这至少是正确的。)问题是UI不会立即更新,而是仅在JS调用堆栈变空后才更新。因此,pushState仍然会使用旧的(过时的)标题,因为文档的新标题尚未应用于DOM。在下次调用此代码段pushState时,会使用之前更改的标题,依此类推。

如果用户从历史记录中选择项目,则用户误导到与用户期望的页面不同的页面,因为每个历史记录条目的标签和历史记录条目的实际目的地不同步。

然而,对我来说,这看起来像Chrome和Firefox中的一个错误。虽然UI仅在JS终止后更新pushState应该已经使用新标题。我已经向Chromium和Mozilla提交了一份错误报告。