sessionStrorage也可以使用onstorage事件吗?

是的,sessionStorage 也可以使用 onstorage 事件,但是有一个重要的区别:只有在同一个标签页内修改 sessionStorage 才会触发 onstorage 事件。 如果你在不同的标签页或窗口修改 sessionStorage,当前标签页的 onstorage 事件不会触发。

这是因为 sessionStorage 是特定于单个浏览器标签页的。当你在一个标签页中修改 sessionStorage 时,只有该标签页会受到影响,其他标签页中的 sessionStorage 保持不变。因此,其他标签页也就没有必要触发 onstorage 事件。

相比之下,localStorage 在所有同源标签页中共享。因此,在一个标签页中修改 localStorage 会导致所有其他同源标签页的 localStorage 也发生变化,并触发它们的 onstorage 事件。

以下是一个简单的例子,演示了 sessionStorageonstorage 事件:

window.addEventListener('storage', function(e) {
  if (e.storageArea === sessionStorage) { // 确认是sessionStorage触发的事件
    console.log('sessionStorage changed: ', e.key, e.oldValue, e.newValue, e.url);
  }
});

// 在同一个标签页内修改sessionStorage
sessionStorage.setItem('name', 'Gemini');

// 在同一个标签页内再次修改sessionStorage
sessionStorage.setItem('name', 'Gemini Pro');


// 在新的标签页或窗口中修改sessionStorage (不会触发当前标签页的onstorage事件)
//  -- 在新标签页执行以下代码 --
// sessionStorage.setItem('name', 'Gemini Other Tab'); 

在这个例子中,只有前两次 setItem 调用会触发 onstorage 事件,并输出修改的键、旧值和新值。 如果你在新的标签页或窗口中修改 sessionStorage,当前标签页的 onstorage 事件不会被触发。

所以,使用 sessionStorageonstorage 事件时,要记住它的局限性,它只在同一个标签页内有效。 如果你需要在不同标签页之间进行通信,应该使用 localStorage 或其他跨标签页通信机制,例如 BroadcastChannelpostMessage

posted @ 2024-12-09 06:07  王铁柱6  阅读(28)  评论(0)    收藏  举报