Javascript 如何设置浏览器为history.pushState显示的条目的标题?

Javascript 如何设置浏览器为history.pushState显示的条目的标题?,javascript,dom,title,pushstate,Javascript,Dom,Title,Pushstate,我使用history.pushState(stateObject,title,url)将新条目推送到浏览器的历史堆栈中。尽管名称不同,第二个参数title不会设置浏览器历史记录中显示的条目的标题。如果我理解正确,标题保留供将来使用,目前被所有浏览器忽略。在这里传递'应该是安全的,我的发现支持这一点 因此,我想知道如何设置用户将在其历史记录中看到的标签,我认为document.title可以完成这项工作。所以我的代码看起来像这样 var myTitle = /* code to generate

我使用
history.pushState(stateObject,title,url)
将新条目推送到浏览器的历史堆栈中。尽管名称不同,第二个参数
title
不会设置浏览器历史记录中显示的条目的标题。如果我理解正确,
标题
保留供将来使用,目前被所有浏览器忽略。在这里传递
'
应该是安全的,我的发现支持这一点

因此,我想知道如何设置用户将在其历史记录中看到的标签,我认为
document.title
可以完成这项工作。所以我的代码看起来像这样

var myTitle = /* code to generate title here */
var myURL = /* code to generate url here */
var myState = /* code to generate realizable state object here */    

document.title = myTitle;
history.pushState( myState, '', myURL ); // 2nd parameter can also be myTitle; this has no effect on all major browsers
然而,它并没有像预期的那样工作。更确切地说,我遇到了一个奇怪的错误。似乎
pushState
没有使用新的
document.title
创建新的历史记录条目,而是使用以前的标题。我猜问题在于DOM不会立即更新,而是在JS离开当前调用堆栈之后才更新。因此
document.title=myTitle
pushState
之后生效

W3C的HTML5规范说明如下:

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

这是所有主要浏览器都实现的行为。然而,UI和新标题只有在JS函数返回后才会更新


有解决方案吗?

当活动历史记录条目更改时,将触发popstate事件。如果激活的历史记录条目是通过调用history.pushState()创建的,或者受调用history.replaceState()的影响,则popstate事件的state属性包含历史记录条目的state对象的副本

window.addEventListener('popstate', function(e) {
  var character = e.state;

      document.title = "Title | ";

});

这如何帮助设置用于浏览器历史记录中条目的正确标题?我指的是HTML 5规范第5.5.2章第8点下方的注释[[。它说:“标题纯粹是建议性的。用户代理可能会在用户界面中使用标题。”但问题是,直到JS函数结束时,UI才会更新。请在push.pushState()之前将该标题设置为变量然后,您可以访问EventListener中的标题。您可以使用此处的许多逻辑。我相信您没有遇到问题。问题在于
pushState
在浏览器历史记录中创建了一个新条目,并使用了错误的(过时的、以前的)条目创建此条目的标题。因此,从历史记录中选择项目的web应用程序用户会被误导到他期望的其他页面,因为标题(在浏览器的历史记录中)被关闭了一个。这与“popstate”事件完全无关。也许,您应该重新阅读此问题。