history.replaceState()的例子?

任何一个可以给history.replaceState一个工作的例子吗? 这就是w3.org所说的:

history . replaceState(data, title [, url ] )

更新会话历史logging中的当前条目,使其具有给定的数据,标题和URL(如果提供的话不为空)。

更新:

这完美地工作:

 history.replaceState( {} , 'foo', '/foo' ); 

url正在改变,但标题没有改变。 这是一个错误还是我错过了什么? testing最新的Chrome。

事实上,这是一个错误,虽然有意为2年。 问题在于当涉及到document.title和back / forward时,一些不明确的规格和复杂性。

查看Webkit和Mozilla的 bug参考。 此外,在介绍历史API的Opera上表示,它没有使用标题参数 ,可能还是没有。

目前,pushState和replaceState的第二个参数 – 历史logging的标题 – 在Opera的实现中没有使用,但可能是一天。

潜在的解决scheme

我看到的唯一方法是改变标题元素,并使用pushState来代替:

 document.getElementsByTagName('title')[0].innerHTML = 'bar'; window.history.pushState( {} , 'bar', '/bar' ); 

这是一个最小的,人为的例子。

 console.log( window.location.href ); // whatever your current location href is window.history.replaceState( {} , 'foo', '/foo' ); console.log( window.location.href ); // oh, hey, it replaced the path with /foo 

还有更多replaceState()但我不知道你到底想做什么。

history.pushState当前页面状态推送到历史堆栈,并更改地址栏中的URL。 所以,当你回去的时候,那个状态(你传递的对象)就会返回给你。

目前,这只是它。 任何其他页面操作(如显示新页面或更改页面标题)都必须由您完成。

你链接的W3C规范只是一个草案,浏览器可能会以不同的方式实现。 例如, Firefox完全忽略title参数。

下面是我在我的网站上使用的一个简单的pushState示例。

 (function($){ // Use AJAX to load the page, and change the title function loadPage(sel, p){ $(sel).load(p + ' #content', function(){ document.title = $('#pageData').data('title'); }); } // When a link is clicked, use AJAX to load that page // but use pushState to change the URL bar $(document).on('click', 'a', function(e){ e.preventDefault(); history.pushState({page: this.href}, '', this.href); loadPage('#frontPage', this.href); }); // This event is triggered when you visit a page in the history // like when yu push the "back" button $(window).on('popstate', function(e){ loadPage('#frontPage', location.pathname); console.log(e.originalEvent.state); }); }(jQuery)); 

看看这个例子

 window.history.replaceState({ foo: 'bar' }, 'Nice URL Title', '/nice_url'); window.onpopstate = function (e) { if (typeof e.state == "object" && e.state.foo == "bar") { alert("Blah blah blah"); } }; window.history.go(-1); 

并searchlocation.hash ;

第二个参数标题并不意味着页面的标题 – 它更多的是页面状态的定义/信息

但是我们仍然可以使用onpopstate事件来更改标题,并且不是从第二个parameter passing标题名称,而是从作为对象传递的第一个parameter passing标题名称

参考: http : //spoiledmilk.com/blog/html5-changing-the-browser-url-without-refreshing-page/

根据MDN历史文档
很明显,第二个论点是为了将来用于现在而不是。 你是对的,第二个参数是处理网页标题,但目前它被所有主stream浏览器忽略。

Firefox目前忽略这个参数,尽pipe将来可能会使用它。 在这里传递空string应该对将来对方法的更改是安全的。 或者,您可以通过一个简短的标题为您正在移动的状态。

我真的想回应@ Sev的答案。

Sev是对的, window.history.replaceState里面有一个bug

要解决这个问题,只需重写构造函数即可手动设置标题。

 var replaceState_tmp = window.history.replaceState.constructor; window.history.replaceState.constructor = function(obj, title, url){ var title_ = document.getElementsByTagName('title')[0]; if(title_ != undefined){ title_.innerHTML = title; }else{ var title__ = document.createElement('title'); title__.innerHTML = title; var head_ = document.getElementsByTagName('head')[0]; if(head_ != undefined){ head_.appendChild(title__); }else{ var head__ = document.createElement('head'); document.documentElement.appendChild(head__); head__.appendChild(title__); } } replaceState_tmp(obj,title, url); }