這篇文章分享給大家的內容是關於Storage Event如何實現頁間通信,內容很有參考價值,希望可以幫到有需要的小伙伴。
我們都知道觸發window.onstorage必須滿足以下兩個條件:
透過localStorage.setItem或sessionStorage.setItem儲存(更新)某個storage
在儲存(更新)這個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個有用的屬性,它們分別是:
key 被初始化或更新的storage的鍵名稱
oldValue 被初始化或更新的storage之前的值
以上是Storage Event如何實現頁間通信的詳細內容。更多資訊請關注PHP中文網其他相關文章!