我依靠“AJAX 调用”编写我的第一个单页网站大约一个星期,认为这些会给我一个“SPA”,然而,在某些时候,当我点击顶部的刷新按钮时 [纯粹是运气],我看到的是最新的AJAX调用的字符串结果,在浏览器的白页上,而不是我网站的HTML页面!
实际上,原因是我将浏览器的 URL 更改为window.history.pushState
,然后请求直接发送到后端,而不是通过我的 JavaScript 代码。
事情(盲目尝试)到目前为止我已经尝试过(TL; DR-Caution:他们都没有工作):
我以为我能做的第一件事就是删除历史记录!但是,这似乎不可能(单个重定向除外)。否则,如果一个网站可以欺负用户其他网站的历史记录,则可能会导致明显的隐私问题!
下一个想法是改变浏览器的历史。我认为也许只将主页(包装所有为 AJAX 响应创建的 DOM 元素的页面)注入到 将使window.history
浏览器忽略接下来发生的任何其他事情。我错了。
我还想到了将整个 DOM 元素存储在一个变量中并将其推送到 的丑陋解决方案window.history
,但随后检测刷新事件并将其与直接访问区分开来将是下一个挑战。
我还尝试监听 beforeunload 事件,试图阻止刷新,然后自己更改位置(这样听起来像是实际刷新),但是在单击刷新按钮后更改浏览器的 url,因此新URL获胜当点击刷新按钮时,'影响浏览器已经向其发送请求的路由。
那么有没有一种方法可以用 vanilla JavaScript 来处理这个问题?或者也许我误会了一些简单的事情?或者更好的解决方案是使用 React、VueJS 等工具来“更轻松”地完成我的 SPA?这些工具都没有问题,我只是更喜欢更简单的方法。我想要的 SPA 类似于MongoDB 网站的文档页面。
编辑:代码:
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
data = JSON.parse(xhr.responseText);
content_box.innerHTML = data.content;
window.history.pushState({"content":data.content, "title": data.title + " | App Manual"}, data.title + " | App Manual", href);
莫回无
相关分类