JavaScript 本地存储在 Chrome 和 Edge 中被删除,但在 Firefox 中没有

Posted

技术标签:

【中文标题】JavaScript 本地存储在 Chrome 和 Edge 中被删除,但在 Firefox 中没有【英文标题】:JavaScript Local Storage removes in Chrome and Edge but not within Firefox 【发布时间】:2021-12-12 19:27:05 【问题描述】:

我当前的问题是,如果用户在 URL 中输入错误的邮政编码而遇到错误,则本地存储会保留需要删除的数据。在 Chrome 和 Edge 中,这按预期工作。

首先我有一个全局变量 apiFailed 设置为 false。 我有 weatherData ,它是一个对象数组,用于存储和访问 API 数据属性, 我有用于 localStorage getItem() 和 setItem() 和 removeItem() 属性的 storedData,以及分配了 storedData 变量并用于显示和检索持久化 localStorage 数据的 savedWeatherData。

在第一次运行时,由于 localStorage 没有数据并且为空,我检查了这一点,然后将 savedWeatherData 变量分配给持久数据。我还检查以确保 apiFailed 为假。我还刷新了页面(通过代码),只是为了确保检索到数据。该代码可在下面找到:

if (savedWeatherData == null || savedWeatherData == undefined 
|| savedWeatherData === null || savedWeatherData === undefined) 
        if (apiFailed == false) 
          console.log('savedWeatherData is NuLL');
          storedData = JSON.parse(window.localStorage.getItem('data'));
          savedWeatherData = storedData;
          window.location.reload();

          if (navigator.userAgent.indexOf("Firefox") != -1) 
            console.log('You are in Firefox');
          
        
       else 
        if (apiFailed == false) 
          console.log('savedWeatherData is NOT NULL');
          // if (navigator.userAgent.indexOf("Firefox") != -1) 
        
      

这在所有浏览器、Chrome、Edge 和 Firefox 中都能正常工作。在第一页启动时,没有 localStorage 数据,因此它被分配并且页面刷新。刷新后,localStorage 不再为 null,并且已分配给 savedWeatherData。然后在整个应用程序中使用它来检索和显示数据。

但是,如果用户在任何时候输入了错误的邮政编码,比如错误地输入了一个特殊字符,Chrome 和 Edge 会按预期运行下面的代码,而是显示一个错误页面并且不获取任何数据。

  console.log('APIFAILED status ' + apiFailed);
  if (apiFailed == true) 
    storedData = window.localStorage.removeItem("data");
    savedWeatherData = storedData;
  

我的问题来了,在 Firefox 中,apiFailed 的 console.log 显示这仍然是错误的。因此 localStorage 不会被删除。这意味着错误页面不会在 Firefox 中显示,而不是像在 Chrome 和 Edge 中那样显示错误消息,因为 localStorage 仍然有数据,即使用户没有输入正确的邮政编码,这些数据也会显示为. localStorage 保存的数据不会在 Firefox 的 localStorage 中删除。它确实从 Chrome 和 Edge 的 localStorage 中删除了,我在开发者控制台中看到了。

这是我如何显示我的错误页面。 (这是通过使用 Phaser 3 框架完成的):

if (apiFailed == true) 
    background = this.add.image(this.game.canvas.width / 2, this.game.canvas.height / 2, "sorryBackground");
    var apiFailText = this.add.text(150, this.game.canvas.height / 2 - 100, "Sorry. The weather forecast is currently unavailable",
       fontFamily: "Open Sans, sans-serif", fontSize: 70, ).setOrigin(0, 0);
    storedData = window.localStorage.removeItem("data");
    savedWeatherData = storedData;
  

我还应该提到,在获取、检索和设置 API 数据之后,apiFailed 在 catch 中设置为 true。

这里:

        .catch(() => 
      console.log(".catch() called. Error within the .fetch()");
      apiFailed = true;
    );

任何帮助和反馈将不胜感激。

谢谢。

【问题讨论】:

与其他浏览器相比,Firefox 似乎总是会引起问题。 @Deeroy 想想另一个适用的例子(不包括非标准的控制台,浏览器以不同的方式处理)。 【参考方案1】:

我解决了这个问题。

我在 Firefox 中注意到该问题是由于它从我的 API 获取请求中收到 400 错误而引起的。 Chrome 和 Edge 并非如此。因此,最后我修改了我的 fetch 以便通过响应我可以看到我是否收到任何错误。如果确实出现任何错误,我只需清除整个 localStorage 并将 apiFailed 设置为 true,然后运行代码块以显示错误页面和消息。

这是我的 fetch 中的 if 语句:

 if (!response.ok) 
        apiFailed = true;
        window.localStorage.clear();
   

这是显示错误页面的 if 语句。以防万一,我在这里通过删除 localStorage 中存储的 API 数据来执行相同的操作,并将我的 savedWeatherData 变量设置为此。

if (apiFailed == true) 
    background = this.add.image(this.game.canvas.width / 2, 
    this.game.canvas.height / 2, "sorryBackground");
    var apiFailText = this.add.text(150, this.game.canvas.height / 2 - 100, 
      "Sorry. The weather forecast is currently unavailable.",  fontFamily: 
      "Open Sans, sans-serif", fontSize: 70, ).setOrigin(0, 0);
    storedData = window.localStorage.removeItem('data');
    savedWeatherData = storedData;
  

经过测试,现在可以在所有主流浏览器中使用:Chrome、Edge 和 Firefox

【讨论】:

【参考方案2】:

我解决了这个问题。

我在 Firefox 中注意到该问题是由于它从我的 API 获取请求中收到 400 错误而引起的。 Chrome 和 Edge 并非如此。因此,最后我修改了我的 fetch 以便通过响应我可以看到我是否收到任何错误。如果确实出现任何错误,我只需清除整个 localStorage 并将 apiFailed 设置为 true,然后运行代码块以显示错误页面和消息。

这是我的 fetch 中的 if 语句:

   if (!response.ok) 
        apiFailed = true;
        window.localStorage.clear();
   

这是显示错误页面的 if 语句。以防万一,我在这里通过删除 localStorage 中存储的 API 数据来执行相同的操作,并将我的 savedWeatherData 变量设置为此。

  if (apiFailed == true) 
    background = this.add.image(this.game.canvas.width / 2, 
    this.game.canvas.height / 2, "sorryBackground");
    var apiFailText = this.add.text(150, this.game.canvas.height / 2 - 100, 
      "Sorry. The weather forecast is currently unavailable.",  fontFamily: 
      "Open Sans, sans-serif", fontSize: 70, ).setOrigin(0, 0);
    storedData = window.localStorage.removeItem('data');
    savedWeatherData = storedData;
  

经过测试,现在可以在所有主流浏览器中使用:Chrome、Edge 和 Firefox

【讨论】:

以上是关于JavaScript 本地存储在 Chrome 和 Edge 中被删除,但在 Firefox 中没有的主要内容,如果未能解决你的问题,请参考以下文章

在本地部署在影响 javascript 游戏引擎中编码的 webapp,导致 Chrome 上的 CORS

Chrome 扩展程序是不是可以访问本地存储?

Javascript如何创建和写入本地txt文件

Chrome 扩展:本地存储,如何导出

将Chrome调试器里的JavaScript变量保存成本地JSON文件

chrome 扩展通过共享本地存储将多条消息传递到外部站点