history.replaceState() 示例?

问题描述 投票:0回答:10

任何人都可以提供一个history.replaceState 的工作示例吗?这就是 w3.org 所说的:

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

更新会话历史记录中的当前条目以具有给定的数据、标题和 URL(如果提供且不为空)。


更新

这非常有效:

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

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

javascript ajax html
10个回答
73
投票

确实这是一个错误,尽管已经有两年的时间了。 问题在于一些不明确的规格以及涉及

document.title
和后退/前进时的复杂性。

请参阅 WebkitMozilla 上的错误参考。 Opera 在引入 History API 时也表示它没有使用 title 参数,而且可能仍然没有。

当前pushState和replaceState的第二个参数——标题 历史条目的 - 未在 Opera 的实现中使用,但可能 有一天。

潜在的解决方案

我看到的唯一方法是更改 title 元素并使用 PushState 代替:

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



43
投票

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()

,但我不知道你到底想用它做什么。

    


9
投票
history.pushState

current
页面状态推入历史堆栈,并更改地址栏中的 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));



6
投票

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);

并搜索
location.hash

;

    


2
投票
Title

并不意味着页面的标题 - 它更多的是该页面状态的定义/信息 但是我们仍然可以使用

onpopstate

事件更改标题,并且不从第二个参数传递标题名称,而是作为作为对象传递的第一个参数的属性 参考:

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


2
投票
MDN 历史文档

明确指出第二个参数是为将来使用而不是为现在使用。您是对的,第二个参数是处理网页标题,但目前所有主要浏览器都忽略它。
Firefox 目前忽略此参数,尽管将来可能会使用它。在此处传递空字符串应该可以安全地防止将来对该方法进行更改。或者,您可以传递您要搬到的州的简短标题。


1
投票

Sev 是对的,里面有一个错误

window.history.replaceState


要解决此问题,只需重写构造函数以手动设置标题。

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); }


0
投票
https://www.mozilla.org/foo.html

执行以下 JavaScript: const stateObj = { foo: 'bar' }; history.pushState(stateObj, '', 'bar.html');

这将导致 URL 栏显示 
https://www.mozilla.org/bar2.html

,但不会导致浏览器加载 bar2.html,甚至不会检查 bar2.html 是否存在。


0
投票
http://localhost:4200/inspections/report-details/60c88e4e76b14c00193f5bef

let reportId = '60c88e4e76b14c00193f5bef', scope = "dynamic"

window.history.replaceState(null, null, `inspections/report-details/${reportId}?damagePart=` + scope );

这将产生输出
http://localhost:4200/inspections/report-details/60c88e4e76b14c00193f5bef?damagePart=dynamic/

    


0
投票

window.history.replaceState({}, "", your_url);

© www.soinside.com 2019 - 2024. All rights reserved.