10

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

但是,该title参数似乎没有效果。窗口标题和“历史列表”中条目的标题都没有改变(也许它们都一样)。

我究竟做错了什么?

更新title参数在 chrome 中被简单地忽略了。http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-June/026827.html

4

3 回答 3

14

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

于 2012-12-11T10:03:08.807 回答
4

正如@ujjwal-singh 已经在他的回答中写的那样,第二个参数title可以用作历史记录中条目的标签,但它是可选的,浏览器可以忽略它并决定为标题使用不同的来源。HTML 5 规范第 5.5.2 章第 8 点下方的注释指出

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

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

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

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

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

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

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

于 2016-08-08T13:41:38.887 回答
1

我不知道为什么会这样,但由于接下来是 Rounin的评论:

我有 window.history.pushState(myStateObject, myNewTitle, myNewURL); document.title = myNewTitle; 2020 年 1 月在 Firefox 72 中工作。我不知道在可以实时重置 document.title 之前,我怎么从来没有想到过。优秀的抬头。

我突然发现在 Firefox 91.0b9 中你必须先放 pushState,然后你必须更改标题。然后 Ff 91.0b9 中的历史管理器更改推送状态的确切页面,而不是 uri 略有不同的类似关闭页面。在我的情况下,如果 document.title 首先更改,则历史管理会更改最后两条带有站点类似链接的记录。

例如,如果某些 /page 将更改为 /page/2,并且您更改标题然后将进行 pushState,那么两个记录标题都将更改为您在文档标题中指定的标题,或者可能与 pushState 中的标题有关. 因此,当 document.title 第二次调用时,它可以正常工作

示例(作品):

window.history.pushState(myStateObject, myNewTitle, myNewURL);
document.title = myNewTitle;

并且不像它可能假设的那样(不起作用):

document.title = myNewTitle;
window.history.pushState(myStateObject, myNewTitle, myNewURL);

感谢鲁宁!

于 2021-08-22T14:57:08.980 回答