美文网首页
浏览器中的跨页面通信(三):StorageEvent

浏览器中的跨页面通信(三):StorageEvent

作者: 涅槃快乐是金 | 来源:发表于2023-10-08 22:37 被阅读0次

StorageEvent事件介绍

在某些复杂情况下,如果多个页面都需要访问本地存储的数据,当前页面使用的 storage 被其他页面修改时会触发 StorageEvent 事件,能够通知相关的页面。
  Web Storage API内建了一套事件通知机制,当存储区域的内容发生改变(包括增加修改删除数据)时,就会自动触发 storage 事件,并把它发送给所有感兴趣的监听者。因此,如果需要跟踪存储区域的改变,就需要在关心存储区域内容的页面监听 storage 事件。(所有支持 localStorage 的浏览器都支持 storage 事件

【事件在同一个域下的不同页面之间触发,即在 A 页面注册了 storge 的监听处理,只有在跟 A 同域名下的 B 页面操作 storage 对象,A 页面才会被触发 storage 事件】

StorageEvent 对象介绍

storage 事件的处理函数接受的 event 事件对象也和通常的事件对象不同,这些属性如下:

//StorageEvent对象
{
    bubbles: false,
    cancelBubble: false,
    cancelable: false,
    composed: false,
    currentTarget: {...}, //当前Window对象
    defaultPrevented: false,
    eventPhase: 0,
    isTrusted: true,
    key: "tabs",//更新的item键名
    newValue: "1",//更新后的item键值
    oldValue: "2",//更新前的item键值
    path: [Window],//一个数组,数组中有一个元素,为当前Window对象
    returnValue: true,
    srcElement: {...}, //当前Window对象
    storageArea: {...}, //Storage对象
    target:{...}, //当前Window对象
    timeStamp: 101647.2000000067,
    type: "storage",
    url: "http://www.localhost.com/list.html",//更新localStorage的页面
 __proto__: StorageEvent
}

我们常用的有如下几个重要的属性,通过这些属性我们可以做很多操作,例如页面之间互相传值,统计当前打开的页面数量(限同源页面)等。

属性 含义
key 设置或删除或修改的键。调用clear()时,则为null。
oldValue 改变之前的旧值。如果是新增元素,则为null。
newValue 改变之后的新值。如果是删除元素,则为null。
storageArea 该属性是一个引用,指向发生变化的sessionStorage或localStorage对象
url 触发这个改变事件的页面的URL
target 当前窗口对象

示例

举例
发送页面:

    <!doctype html>
    <html>
        <head>
            <title>changeStorage</title>
        </head>
        <body>
            <div>
                <p>
                    <input id="input" value="" />
                </p>
                <p>
                    <button id="btn">发送信息</button>
                </p>
                <p id="getMsg"></p>
            </div>
            <script>
                const input = document.querySelector('#input');
                const btn = document.querySelector('#btn');
                const getMsg = document.querySelector('#getMsg');
                localStorage.setItem('test', 'defaultValue'); // 设置一个默认值
                btn.onclick = function() {
                    localStorage.setItem('test', input.value);
                }
            </script>
        </body>
    </html>

接收页面:

    <!doctype html>
    <html>
        <head>
            <title>getStorage</title>
        </head>
        <body>
            <p id="showMsg"></p>
            <script>
                const showMsg = document.querySelector('#showMsg');
                window.addEventListener('storage', (event) => {
                    showMsg.innerText = `key:${event.key}
 旧值:${event.oldValue}
 新值: ${event.newValue}`;
                }, false);
            </script>
        </body>
    </html>

注意点

  • (1)只有在数据的内容确实发生改变的时候,才会触发 storage 事件。如果把一个值设置成一模一样的值,或删除一个根本就不存在的存储项,则不会触发 storage 事件。

  • (2)并且,storage 事件只会发送给同源、而且处于打开状态的其它页面,而·不会发送给触发改变的页面本身及处于关闭状态的页面。

相关文章

网友评论

      本文标题:浏览器中的跨页面通信(三):StorageEvent

      本文链接:https://www.haomeiwen.com/subject/zoobbdtx.html