提问人:Garret Wilson 提问时间:8/31/2023 最后编辑:halferGarret Wilson 更新时间:10/3/2023 访问量:157
防止在“开机自检”时生成浏览器历史记录
Prevent generation of browser history on `POST` to self
问:
我有一台服务器,当它被发送到 时,它会在 HTML 页面中生成“东西”。页面本身使用 JavaScript,以便用户可以重新加载页面(使用 )并查看相同的数据,而无需浏览器询问是否应该重新发送信息。POST
/generate
window.history.replaceState(null, null, window.location.href)
GET
POST
该页面还有一个“重新生成”按钮,该按钮发送回以重新生成新信息。不幸的是,这导致了导航历史记录中的新点,因此用户可以点击浏览器的“后退”按钮返回到页面的先前版本。我不想要这种行为。我希望该页面能够用新生成的内容“替换”当前页面,而无需在导航历史记录中创建新点。POST
/generate
/generate
(我很清楚,更现代的方法是使用 Ajax 异步查询服务器并动态更新页面。我想这就是即将发布的版本中将要做的事情。我要求为该产品的当前版本提供快速解决方法。
有没有办法让页面发送一个,这样它就不会在导航历史记录中产生新的点?页面上的 JavaScript 可以检测是否发生重新生成,但我无法找到如何删除当前导航状态,只能替换它。理想情况下,我希望根本不会在导航历史记录中创建新点。POST
POST
我看不出这有什么可能,但我想我会由社区运行它,看看是否有人知道一个技巧。
答:
就像你提到的,确实不可能阻止浏览器历史记录的生成。同一页面上的 POST 请求仍将创建一个 URL,您只能通过自己的方式编写代码来屏蔽该方法或使其看起来像处于相同状态。
我发现这两个社区帖子中的对话与此事相关:
前言
如果不在导航历史记录中创建新点,则无法发送 POST 请求。当您执行 POST 请求时,浏览器会将其视为与服务器的新交互,因此会向历史记录添加一个新条目。
但是,可以在不增加导航历史记录的情况下实现类似的行为。
溶液
方法
- 将事件侦听器附加到“重新生成”按钮。
- 单击该按钮后,使用 JavaScript 通过 Fetch API 或 XMLHttpRequest 向服务器发送 POST 请求。这允许您在不触发页面重新加载的情况下将数据发送到服务器。
- 处理来自服务器的响应,并使用新数据更新页面内容。
- 如有必要,请使用该方法更新 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);
});
});
注意:我匆匆忙忙地做了这件事,所以可能会有一些错别字或错误。
评论
<object>
标签在代理中呈现页面?history.go(-1);
?