我們都知道觸發window.onstorage必須滿足以下兩個條件:
上面的第二個條件,簡單來講就是:要嘛是storage的初始化,因為不存在的storage,其值為null;要嘛就是對已有storage的更新
舉例:
// 初始化storagewindow.localStorage.setItem('a', 123);// 註冊onstorage事件window.onstorage = (e) => { console.log(e);};//storagewindow.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個有用的屬性,它們分別是:
結合這3個關鍵屬性,我們就可以實現頁間的資料同步
最後提一下localStorage與sessionStorage的差別
localStorage 裡面儲存的資料沒有過期時間設置,而儲存在sessionStorage 裡面的資料在頁面會話結束時會被清除
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。