location.assign()无法正常工作

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

我在未将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?

javascript browser-history html5-history
2个回答
0
投票

根据MDN docs上的location.assign,您的参数必须是URL,因此您需要指向PageB.html的相对路径。

我假设应该是类似/PageB.html的东西,/在这里非常重要。您是在告诉JavaScript您位于您所在文件的当前目录中,然后查找PageB.html


0
投票

由于您甚至都没有等待文档被重定向到下一页之前关闭,因此该页面的确不会进入历史记录。

要解决此问题,您只需等待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。在您的位置,我会重新考虑对此的需要。

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