Set/Remove localStorage 项目和 EventListener
Set/Remove localStorage item and EventListener
我一直在搞乱 localStorage 和 EventListener,如下所示(来自 w3schools,但我在搞乱)。下面总是将“存储区域 3 中发生的更改”打印到 div。我猜这是 JS 的异步特性,我必须做一些像 promise chaining 这样的事情吗?
其次,同样地,当我添加从 localStorage 中删除变量时,因此在 EventListener 中检测到该变量为 null,下面将不会向 div 打印任何内容。我假设它在执行实际打印的第一个事件(设置变量)之前看到了删除。无论如何,有没有办法从 localStorage 中设置和删除变量,或者这就是所有异步的东西和需要的承诺(以前的回调和 setTimeouts)?非常感谢。
<button onclick="changeValue()">Change a Storage Item</button>
<p id="demo"></p>
<script>
window.addEventListener("storage", myFunction);
var x;
var c=0;
var mtv;
function myFunction(event) {
if (event.key==="mytime") {
mtv=localStorage.getItem("mytime");
if (mtv===null) {
} else {
document.getElementById("demo").innerHTML = "A change was made in the storage area "+ c;
}
}
}
function changeValue() {
x = window.open("", "myWindow", "width=200,height=100");
c=c+1
x.localStorage.setItem("mytime", "true");
c=c+1;
x.localStorage.removeItem("mytime");
c=c+1;
x.close();
}
</script>
</body>
</html>
更新...我不知道如何在响应中格式化代码,但我没有像上面那样立即删除 localStorage object,而是在 add/remove 上进行了切换localStorage 变量...添加或删除应触发祖父母中的 ActionListener 事件 window...
if(localStorage.getItem('mytime')){
x.localStorage.removeItem("mytime");
}else{
x.localStorage.setItem("mytime", "true");
}
好的,您可以更轻松地查看发生了什么,方法是使用您的代码创建一个 HTML 并在您的浏览器中打开。然后,在事件中和更新存储的地方放置断点。让我们看看:
- 点击按钮
- 打开一个window(没用因为那个window什么都不做)
- 更新存储(尚未触发事件)
- 删除存储(尚未触发事件)
- 关闭window
- 现在,在这两种情况下,您都会收到 c=3 的 2 个事件
如果您需要跟踪您的 c 值,您可以在存储中保存以下值:
x.localStorage.setItem("mytime", c);
然后,您收到第一个 event.newValue="1" 的事件和第二个 event.newValue=null 和 event.oldValue="1" 的事件。
我一直在搞乱 localStorage 和 EventListener,如下所示(来自 w3schools,但我在搞乱)。下面总是将“存储区域 3 中发生的更改”打印到 div。我猜这是 JS 的异步特性,我必须做一些像 promise chaining 这样的事情吗?
其次,同样地,当我添加从 localStorage 中删除变量时,因此在 EventListener 中检测到该变量为 null,下面将不会向 div 打印任何内容。我假设它在执行实际打印的第一个事件(设置变量)之前看到了删除。无论如何,有没有办法从 localStorage 中设置和删除变量,或者这就是所有异步的东西和需要的承诺(以前的回调和 setTimeouts)?非常感谢。
<button onclick="changeValue()">Change a Storage Item</button>
<p id="demo"></p>
<script>
window.addEventListener("storage", myFunction);
var x;
var c=0;
var mtv;
function myFunction(event) {
if (event.key==="mytime") {
mtv=localStorage.getItem("mytime");
if (mtv===null) {
} else {
document.getElementById("demo").innerHTML = "A change was made in the storage area "+ c;
}
}
}
function changeValue() {
x = window.open("", "myWindow", "width=200,height=100");
c=c+1
x.localStorage.setItem("mytime", "true");
c=c+1;
x.localStorage.removeItem("mytime");
c=c+1;
x.close();
}
</script>
</body>
</html>
更新...我不知道如何在响应中格式化代码,但我没有像上面那样立即删除 localStorage object,而是在 add/remove 上进行了切换localStorage 变量...添加或删除应触发祖父母中的 ActionListener 事件 window...
if(localStorage.getItem('mytime')){
x.localStorage.removeItem("mytime");
}else{
x.localStorage.setItem("mytime", "true");
}
好的,您可以更轻松地查看发生了什么,方法是使用您的代码创建一个 HTML 并在您的浏览器中打开。然后,在事件中和更新存储的地方放置断点。让我们看看:
- 点击按钮
- 打开一个window(没用因为那个window什么都不做)
- 更新存储(尚未触发事件)
- 删除存储(尚未触发事件)
- 关闭window
- 现在,在这两种情况下,您都会收到 c=3 的 2 个事件
如果您需要跟踪您的 c 值,您可以在存储中保存以下值:
x.localStorage.setItem("mytime", c);
然后,您收到第一个 event.newValue="1" 的事件和第二个 event.newValue=null 和 event.oldValue="1" 的事件。