任何人都可以提供一个history.replaceState 的工作示例吗?这就是 w3.org 所说的:
history.replaceState(data, title [, url ] )
更新会话历史记录中的当前条目以具有给定的数据、标题和 URL(如果提供且不为空)。
这非常有效:
history.replaceState( {} , 'foo', '/foo' );
URL 正在改变,但标题没有改变。这是一个错误还是我错过了什么?在最新的 Chrome 上测试。
确实这是一个错误,尽管已经有两年的时间了。 问题在于一些不明确的规格以及涉及
document.title
和后退/前进时的复杂性。
请参阅 Webkit 和 Mozilla 上的错误参考。 Opera 在引入 History API 时也表示它没有使用 title 参数,而且可能仍然没有。
当前pushState和replaceState的第二个参数——标题 历史条目的 - 未在 Opera 的实现中使用,但可能 有一天。潜在的解决方案
我看到的唯一方法是更改 title 元素并使用 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
将
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));
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
;
明确指出第二个参数是为将来使用而不是为现在使用。您是对的,第二个参数是处理网页标题,但目前所有主要浏览器都忽略它。
Firefox 目前忽略此参数,尽管将来可能会使用它。在此处传递空字符串应该可以安全地防止将来对该方法进行更改。或者,您可以传递您要搬到的州的简短标题。
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); }
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/
window.history.replaceState({}, "", your_url);