【问题标题】:Page not refreshed after localstorage update and navigate back本地存储更新和导航返回后页面未刷新
【发布时间】:2017-08-13 18:48:30
【问题描述】:

在以下示例中,第一个页面从 localstorage 中检索,然后第二个页面设置 localstorage。在 Firefox 和 Safari(仅限)中,在我刷新页面之前,第一页中的值不会更改。我不需要在 Edge、Chrome、Opera 和 IE 中进行显式刷新。当页面被导航回(返回)到时,如何让 Firefox 和 Safari 处理在另一个页面中更新的项目?

类似问题的先前答案说禁用缓存。我试图以多种方式做到这一点,但它对我不起作用。我尝试了存储事件,但这也不起作用,可能是因为该页面当时在历史记录中。我找不到页面导航回时发生的任何事件。焦点事件可能会起作用,但它可能会很复杂并且很容易出现问题。

请注意,我想要一个解决方案,即使该网站的历史记录中有其他页面也能正常工作。我希望历史记录中的页面在修改本地存储时也自动刷新。因此,即使是对话框或弹出窗口或任何修改本地存储的内容都不起作用,因为它不会影响历史记录中的页面。

以下是第一页的示例:

<!DOCTYPE html>
<html>

    <head>
        <meta content="en-us" http-equiv="Content-Language" />
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
        <meta http-equiv="Cache-Control" content="no-store, must-revalidate" />
        <title>Update Browser</title>
        <script type="application/ecmascript">
            function Show() {
                var Stored = localStorage.getItem("StorageUpdateTest");
                var d = new Date(Stored);
                output.innerHTML = d.toLocaleTimeString();
            }
            window.addEventListener("storage", Show, false);
        </script>
    </head>

    <body onload="Show();">

    <h1>Browser</h1>

    <form method="post">
        <p id="output"></p>
    </form>

    <p><a href="StorageUpdate.html">Update</a></p>

    </body>

</html>

请注意,我有一个元标记来禁用缓存。我也尝试过其他禁用缓存的可能性,但它们都不起作用。以下是第二页的样例:

<!DOCTYPE html>
<html>

<head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <title>Storage Update</title>
    <script type="application/ecmascript">
        function Update() {
            var d = new Date(Date.now());
            localStorage.setItem("StorageUpdateTest", d);
            output.innerHTML = d.toLocaleTimeString();
        }
    </script>
</head>

<body>
<h1>Storage Update</h1>

<form method="post">
    <p id="output"></p>
    <input name="ButtonUpdate" type="button" value="Update" onclick="Update();">
</form>

</body>

</html>

【问题讨论】:

  • 您是否必须依赖用户能够通过点击浏览器中的“返回”按钮来访问 localStorage?如果您改为进行重定向,它将在每个浏览器中都有效。如果我没记错的话,Firefox 会使用后退按钮自动缓存要访问的页面,而 Chrome 和 IE 则不会。在这方面你可能需要META REFRESH
  • 要添加到黑曜石时代,如果明确使用后退按钮对于逻辑来说不是必需,在函数末尾第二页的 Update() 中,您可以使用 @987654326 @.
  • @ObsidianAge,这是我希望许多其他人可以使用的东西,所以我想让它尽可能简单。我尝试了许多元标记的可能性,但没有找到任何可行的方法。
  • 您尝试过this answer 中建议的元标记吗?还有一些关于防止缓存in this answer惊人文档(带有示例):)
  • @Isaiah,这是一个示例,但在实际使用中,第一页可以是网站中的任何页面。

标签: javascript html local-storage


【解决方案1】:

我正在尝试回答以澄清我试图通过 cmets 解释的内容。

首先,您无法浏览浏览器历史记录并刷新页面。通过 JS,您 cannot 通过某种标准方法访问所有浏览器的浏览器历史记录,仅使用浏览器提供的 API,因此您不能拥有任何 JS 逻辑以某种自定义方式利用历史记录(并且适用于所有浏览器,我能想到的唯一可以访问的功能是window.history,但这只是模仿后退/前进按钮的功能)。

编辑

另外:不能“刷新历史页面”。历史是特定于浏览器的功能,每个功能都不同,因为官方规则没有为这种行为明确定义(这也是为什么不缓存也是不行的)。因为页面信息does not persist(某些页面可能一些浏览器中这在其他浏览器中无法保证),您可能无法仅使用 JS/CSS 或任何其他客户端方法(可能是 cookie?)。

/编辑

如果我错了,请纠正我,但这是所需的流程:

用户进入一个页面 (page-a,page-b,page-c, ...) 该页面上有数据 -> 使用来自该页面的链接用户进入一个名为 StorageUpdate.html 的新页面 ->用户使用 StorageUpdate.html 上的接口更新您希望反映在前一页上的数据(将用户发送到 StorageUpdate.html 的页面,可以是 page-a、page-b、page-c 等) .

在 StorageUpdate.html 上更新数据后,要返回的页面不是 静态 页面,而是需要是 动态 (如果用户在 StorageUpdate.html 之前在页面-a 中。 html 然后返回到 page-a,如果用户之前在 page-b 中则返回到 page-b,...)。

为此,我会推荐以下内容:

以下是第一页的 sn-p(可以是 page-a、page-b 或其他任何内容。将下面的“thisPage.html”替换为链接所在页面的名称——这可能是如果需要,使用 JS 和 window.location 动态放置):

...
    <p>
         <a href="StorageUpdate.html?pageToReturnTo=thisPage.html">Update</a>
    </p>
...

那么下面是StorageUpdate.html的sn-p:

...
<script type="application/ecmascript">
    function Update() {
        var d = new Date(Date.now());
        localStorage.setItem("StorageUpdateTest", d);
        output.innerHTML = d.toLocaleTimeString();
        //here is the redirection after update logic takes place (could be in a function)
        var query = window.location.search.substring(1);//only get query vars from url
        var vars = query.split("&");//in case there are multiple params
        var pageToReturnTo = vars[0];//we only want the url param "pageToReturnTo" from above
        window.location = pageToReturnTo;//send user "back" dynamically
    }
</script>
....

此外,对于历史上的所有页面,不需要这样做,因为只需让用户将自己重定向到其他页面,他们就会获得“页面刷新”并拥有最新的数据。

编辑

您可以尝试完全改变流程!例如完全避免“历史问题”的ajax调用!使用异步请求处理更新,然后刷新当前页面。要使这一点在多个页面上生效,您必须组合页面/数据,以便它们可以共同刷新。

/编辑

如果这不是您要查找的内容,您可以在 timing loop 中使用 window.location = window.location 强制刷新页面。同样,您需要一些外部变量(可能是 get 变量,因为它会在页面刷新期间持续存在),当您不希望刷新发生时,阻止刷新。

编辑

最后,this 可能是您的最佳选择。定时循环需要此处提供的一些信息。我相信定时循环将是您最好的选择,因为它会强制页面刷新,棘手的部分是确定 when 强制它。在同一个链接中,您还会发现一些检测前进/后退按钮按下事件的 JS 形式越来越多supported

/编辑

【讨论】:

  • 请注意,我说“我希望历史记录中的页面也自动刷新”。请注意,“pages”是复数形式。是的,我当然知道我们对历史的了解非常有限。如果我们确实更新了链接到“存储更新”的页面,那么我们仍然会遇到当再次按下后退按钮时历史页面也需要刷新的问题。如果有必要,我可以弄清楚如何使用计时器,但我想要页面内部需要刷新的东西。这可能是不可能的,但如果是,那么它是特定于 Firefox 和/或 Safari 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2012-08-12
  • 2013-06-14
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多