利用Storage Event實現頁面間通訊

郭某某發表於2019-03-03

我們都知道觸發window.onstorage必須滿足以下兩個條件:

  1. 通過localStorage.setItem或sessionStorage.setItem儲存(更新)某個storage
  2. 儲存(更新)這個storage時,它的新值必須與之前的值不同

上面的第二個條件,簡單來講就是:要麼是storage的初始化,因為不存在的storage,其值為null;要麼就是對已有storage的更新

舉例:

// 初始化storage
window.localStorage.setItem(`a`, 123);

// 註冊onstorage事件
window.onstorage = (e) => {
  console.log(e);
};

// 更新storage
window.localStorage.setItem(`a`, 123);
複製程式碼

上面的最後一行程式碼並不會觸發onstorage事件,因為a的值並沒有變化,前後都是123,所以瀏覽器判定這次更新是無效的

由於onstorage事件是瀏覽器觸發的,所以如果我們開啟了多個相同域名下的頁面,並在其中任一一個頁面執行window.localStorage.setItem方法(還要保證滿足文章開頭提到的第二個條件),那麼其他頁面如果監聽了onstorage事件,則這些頁面中的onstorage事件回撥都會被執行

舉例:

// http://www.example.com/a.html
<script>
// 註冊onstorage事件
window.onstorage = (e) => {
  console.log(e);
};
</script>
複製程式碼
// http://www.example.com/b.html
<script>
// 註冊onstorage事件
window.onstorage = (e) => {
  console.log(e);
};
</script>
複製程式碼
// http://www.example.com/c.html
<script>
// 觸發onstorage事件
window.localStorage.setItem(`a`, new Date().getTime());
</script>
複製程式碼

只要保證c頁面在a和b頁面之後開啟(哪怕三個頁面不在同一瀏覽器視窗,這裡需要區別視窗與tab頁的區別),那麼a和b頁面中的onstorage事件都會被觸發

現在我們已經知道如何利用storage event實現了頁面之間的通訊,那麼這個通訊對於我們有何用途呢?
其實我們只需知道是哪個storage的更新操作觸發了onstorage事件就足夠了,那麼我們如何知道呢?onstorage事件回撥和其他事件回撥函式一樣,也接收一個event物件引數,在這個物件中有3個有用的屬性,它們分別是:

  1. key 被初始化或更新的storage的鍵名
  2. oldValue 被初始化或更新的storage之前的值
  3. newValue 被初始化或更新的storage之後的值

結合這3個關鍵屬性,我們就可以實現頁面間的資料同步

最後提一下localStorage與sessionStorage的區別

localStorage 裡面儲存的資料沒有過期時間設定,而儲存在 sessionStorage 裡面的資料在頁面會話結束時會被清除

原文地址:www.guoyunfeng.com/2018/07/22/…

相關文章