防止在“开机自检”时生成浏览器历史记录

Prevent generation of browser history on `POST` to self

提问人:Garret Wilson 提问时间:8/31/2023 最后编辑:halferGarret Wilson 更新时间:10/3/2023 访问量:157

问:

我有一台服务器,当它被发送到 时,它会在 HTML 页面中生成“东西”。页面本身使用 JavaScript,以便用户可以重新加载页面(使用 )并查看相同的数据,而无需浏览器询问是否应该重新发送信息。POST/generatewindow.history.replaceState(null, null, window.location.href)GETPOST

该页面还有一个“重新生成”按钮,该按钮发送回以重新生成新信息。不幸的是,这导致了导航历史记录中的新点,因此用户可以点击浏览器的“后退”按钮返回到页面的先前版本。我不想要这种行为。我希望该页面能够用新生成的内容“替换”当前页面,而无需在导航历史记录中创建新点。POST/generate/generate

(我很清楚,更现代的方法是使用 Ajax 异步查询服务器并动态更新页面。我想这就是即将发布的版本中将要做的事情。我要求为该产品的当前版本提供快速解决方法。

有没有办法让页面发送一个,这样它就不会在导航历史记录中产生新的点?页面上的 JavaScript 可以检测是否发生重新生成,但我无法找到如何删除当前导航状态,只能替换它。理想情况下,我希望根本不会在导航历史记录中创建新点。POSTPOST

我看不出这有什么可能,但我想我会由社区运行它,看看是否有人知道一个技巧。

javascript html post 浏览器历史

评论

0赞 moonwave99 9/2/2023
也许通过<object>标签在代理中呈现页面
0赞 sylvain 9/3/2023
如何使用 sessionStorage - javascripttutorial.net/web-apis/javascript-sessionstorage
0赞 imhvost 9/3/2023
history.go(-1);?

答:

0赞 Mel 9/4/2023 #1

就像你提到的,确实不可能阻止浏览器历史记录的生成。同一页面上的 POST 请求仍将创建一个 URL,您只能通过自己的方式编写代码来屏蔽该方法或使其看起来像处于相同状态。

我发现这两个社区帖子中的对话与此事相关:

-1赞 Hind Sagar Biswas 9/9/2023 #2

前言

如果不在导航历史记录中创建新点,则无法发送 POST 请求。当您执行 POST 请求时,浏览器会将其视为与服务器的新交互,因此会向历史记录添加一个新条目。

但是,可以在不增加导航历史记录的情况下实现类似的行为。

溶液

方法

  1. 将事件侦听器附加到“重新生成”按钮。
  2. 单击该按钮后,使用 JavaScript 通过 Fetch API 或 XMLHttpRequest 向服务器发送 POST 请求。这允许您在不触发页面重新加载的情况下将数据发送到服务器。
  3. 处理来自服务器的响应,并使用新数据更新页面内容。
  4. 如有必要,请使用该方法更新 URL。window.history.replaceState

简化示例

document.getElementById('regenerateButton').addEventListener('click', function() {
    // Perform an asynchronous POST request
    fetch('/generate', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json', // Adjust the content type as needed
        },
        body: JSON.stringify({ /* Your POST data here */ }),
    })
    .then(response => response.text()) // Assuming the response is text, adjust as needed
    .then(newData => {
        // Update the page content with the new data
        document.getElementById('contentContainer').innerHTML = newData;

        // Optionally, update the URL without adding to the history
        window.history.replaceState(null, null, window.location.href);
    })
    .catch(error => {
        console.error('Error:', error);
    });
});

注意:我匆匆忙忙地做了这件事,所以可能会有一些错别字或错误。

评论

0赞 Garret Wilson 9/9/2023
我很欣赏你的努力,但请看我问题的部分,我说,“我很清楚,一种更现代的方法是使用 Ajax 异步查询服务器并动态更新页面。看起来您提供了一个解决方案来“使用 Ajax 异步查询服务器并动态更新页面”,这正是我指定我没有问的问题。也许你没有注意到这句话,因为我使用了一个较旧的术语“Ajax”,这就是这种技术第一次被广泛接受时的名字。
0赞 Hind Sagar Biswas 9/10/2023
我很欣赏你的讽刺评论(不知道这是有意还是无意),但请看我回答的部分,我说“如果不在导航历史记录中创建一个新点,就不可能发送 POST 请求。看来我提供了解决方案,以便如果有人遇到这个问题,他们也可能得到解决这个问题/迂回的方式。也许您不知道这方便了其他堆栈溢出用户。我确实回答了你的问题,并提供了环形交叉路口,所以我认为我不值得投反对票