我在未将URL添加到浏览器历史记录堆栈中时遇到问题。这些简短的代码清楚地说明了问题:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Page A</title>
</head>
<body>
<h1>Page A</h1>
<script>
location.assign("PageB.html");
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Page B</title>
</head>
<body>
<h1>Page B</h1>
</body>
</html>
在浏览器地址栏中输入地址“ localhost / PageA.html”应将页面A的URL置于浏览器历史记录中。然后,location.assign(“ PageB.html”)应将页面B的URL放在浏览器历史记录中页面A的顶部。但是,我发现情况并非如此。页面A的URL永远不会放在浏览器历史记录中。这是为什么?如何在浏览器历史记录中保留页面A的URL?
根据MDN docs上的location.assign
,您的参数必须是URL,因此您需要指向PageB.html
的相对路径。
我假设应该是类似/PageB.html
的东西,/
在这里非常重要。您是在告诉JavaScript您位于您所在文件的当前目录中,然后查找PageB.html
由于您甚至都没有等待文档被重定向到下一页之前关闭,因此该页面的确不会进入历史记录。
要解决此问题,您只需等待DOMContentLoaded事件或添加零超时即可。这将确保文档已关闭并且历史记录条目已注册:
const pageB_html = URL.createObjectURL(
new Blob( [ `
<DOCTYPE html>
<html>
<head> <title>Page B</title> </head>
<body>
<br>
<h1>Page B</h1>
<button id="btn">history.back()</button>
<script>
document.getElementById('btn').onclick = e =>
history.back();
<\/script>
</bod>
</html>`
], { type: 'text/html' } )
);
addEventListener( 'DOMContentLoaded', () => {
setTimeout( _ =>location.assign( pageB_html ) );
} );
:root{ color: red }
<h1>Page A</h1>
但是请注意,在我看来,直接重定向页面会导致非常糟糕的UX。在您的位置,我会重新考虑对此的需要。