jquery 如何在一小时后删除本地存储?

nkhmeac6  于 2023-06-22  发布在  jQuery
关注(0)|答案(9)|浏览(158)

我的数据是对象
我保存它使用本地存储JavaScript像这样:

localStorage.setItem('storedData', JSON.stringify(data))

我只想保留这些数据1小时。因此,如果超过1小时,那么数据将被删除
我知道如何删除这样的数据:

localStorage.removeItem("storedData")

但是我怎么能设置为1小时后自动删除呢?

dluptydi

dluptydi1#

你不能。When do items in HTML5 local storage expire?你唯一能做的就是将delete语句设置为1小时的超时。这需要用户停留在您的页面上,否则不会执行超时。
您还可以设置过期字段。当用户重新访问您的站点时,您要做的第一件事就是检查过期时间并在下次访问时删除存储。

iezvtpos

iezvtpos2#

在App.js文件中添加以下代码,然后每隔1小时就会清空一次localStorage

var hours = 1; // to clear the localStorage after 1 hour
               // (if someone want to clear after 8hrs simply change hours=8)
var now = new Date().getTime();
var setupTime = localStorage.getItem('setupTime');
if (setupTime == null) {
    localStorage.setItem('setupTime', now)
} else {
    if(now-setupTime > hours*60*60*1000) {
        localStorage.clear()
        localStorage.setItem('setupTime', now);
    }
}
zynd9foi

zynd9foi3#

使用setInterval,在本地数据中设置/推送到期密钥,检查下面的代码。

var myHour = new Date();
myHour.setHours(myDate.getHours() + 1); //one hour from now
data.push(myHour);
localStorage.setItem('storedData', JSON.stringify(data))

function checkExpiration (){ 
    //check if past expiration date
        var values = JSON.parse(localStorage.getItem('storedData'));
    //check "my hour" index here
    if (values[1] < new Date()) {
        localStorage.removeItem("storedData")
    }
}

function myFunction() {
    var myinterval = 15*60*1000; // 15 min interval
    setInterval(function(){ checkExpiration(); }, myinterval );
}

myFunction();
wbgh16ku

wbgh16ku4#

你不能使用setTimeout()。因为你不能保证你的代码将在1小时内在浏览器上运行。但是你可以设置一个时间戳,在返回时只需检查时间戳并根据到期条件清除存储。

pengsaosao

pengsaosao5#

使用cookies代替
Cookies.set('foo_bar', 1, { expires: 1/24 })

zi8p0yeb

zi8p0yeb6#

或者,您可以在WebWorkers中使用IndexedDB。它的基本意思是你可以创建一个与主线程并行的JavaScript程序,就像这样

var worker = new Worker('worker.js');

优点是当它完成工作时,您没有对它的引用,它会自动清理。然而,由于我不能完全确定以上内容,这里是来自生活标准的工人的寿命
工作进程通过消息通道及其MessagePort对象与其他工作进程和浏览上下文进行通信。
每个WorkerGlobalScope对象worker全局作用域都有一个worker端口列表,其中包含与另一个端口纠缠的所有MessagePort对象,并且worker全局作用域拥有一个(但只有一个)端口。此列表包括专用工作进程情况下的隐式MessagePort。
在创建或获取worker时,给定环境设置对象o,要添加的相关所有者取决于o指定的全局对象的类型。如果o指定了一个全局对象,它是一个WorkerGlobalScope对象(即,如果我们正在创建一个嵌套的专用worker),那么相关的所有者就是那个全局对象。否则,o指定一个全局对象,它是一个Window对象,相关的所有者是o指定的负责文档。如果worker的WorkerGlobalScope的所有者集不为空,或者:

  • 其所有者集为空的时间不超过一个短的实现定义的超时值,
  • 其WorkerGlobalScope对象是SharedWorkerGlobalScope对象(即,工作者是共享工作者),并且
  • 用户代理具有其Document对象未完全加载的浏览上下文。

另一个优点是可以终止一个worker,就像这样

worker.terminate();

还有,值得一提的是
IndexedDB内置了对模式版本的支持,并通过IDBOpenDBRequest.onupgradeneeded()方法进行升级;但是,您仍然需要编写升级代码,使其能够处理来自以前版本(包括有bug的版本)的用户。

dfuffjeb

dfuffjeb7#

这适用于在页面呈现时浏览器窗口未重新加载的SPA:
在本地存储中设置expiresIn字段。在窗口重新加载时检查是否看到if current time >= expiresInif true clear localStorage items else carry on您也可以在业务逻辑需要时执行此检查。

4si2a6ki

4si2a6ki8#

只需在您的应用程序中添加检查以检查变量是否存在,然后对其进行检查。在变量上放置一个unix timestamp,并在用户下次访问您的站点时进行比较。

gpnt7bae

gpnt7bae9#

我认为setTimeout()方法可以做到这一点。

已更新:

在将值设置为localStorage的同时,还设置了记录数据的时间。

// Store the data with time
const EXPIRE_TIME = 1000*60*60;
localStorage.setItem('storedData', JSON.stringify({
  time: new Date(),
  data: "your some data"
}));

// start the time out

setTimeout(function() {
    localStorage.removeItem('storedData');
}, EXPIRE_TIME); // after an hour it will delete the data

现在的问题是,如果用户离开网站。而且setTimeout将不起作用。因此,当用户下次访问该网站时,您必须再次引导setTimeout。

// On page load
$(document).ready(function() {
  let userData = JSON.parse(localStorage.getItem('storedData')) || {};
  let diff = new Date() - new Date(userData.time || new Date());
  let timeout = Math.max(EXPIRE_TIME - diff, 0);
  setTimeout(function() {
      localStorage.removeItem('storedData');
  }, timeout);
})

相关问题