HTML5 storage事件監聽


引用《h5移動web開發指南》上的話:

“當同源頁面的某個頁面修改了localStorage,其余的同源頁面只要注冊了storage事件,就會觸發”

 

所以,localStorage  storage的例子運行需要如下條件:

同一瀏覽器打開了兩個同源頁面

其中一個網頁修改了localStorage

另一網頁注冊了storage事件

 

Storage事件

在某些復雜情況下,如果多個頁面都需要訪問本地存儲的數據,就需要在存儲區域的內容發生改變時,能夠通知相關的頁面。

Web Storage API內建了一套事件通知機制,當存儲區域的內容發生改變(包括增加、修改、刪除數據)時,就會自動觸發 storage 事件,並把它發送給所有感興趣的監聽者。因此,如果需要跟蹤存儲區域的改變,就需要在關心存儲區域內容的頁面監聽 storage 事件。

所有支持 localStorage 的瀏覽器都支持 storage 事件,包括 IE8。但IE 8不支持 W3C 標准的 addEventListener。因此,為了監聽 storage 事件,還需要檢測瀏覽器支持哪種事件機制:

if (window.addEventListener) {

    window.addEventListener("storage", handleStorage, false);

} else {

    window.attachEvent("onstorage", handleStorage);

}

handleStorage 回調函數接受一個 StorageEvent 參數,在IE中,StorageEvent對象保存在 window.event 里面。

 

function handleStorage(e) {

  if (!e) {

    e = window.event;

  }

}

此時,變量 e 就是一個 StorageEvent 對象,這個對象有很多有用的屬性。這些屬性及含義見表:

表 StorageEvent對象的屬性及含義

屬性       含義

key 設置或刪除或修改的鍵。調用clear()時,則為null。

oldValue      改變之前的舊值。如果是新增元素,則為null。

newValue     改變之后的新值。如果是刪除元素,則為null。

storageArea 該屬性是一個引用,指向發生變化的sessionStorage或localStorage對象

url   觸發這個改變事件的頁面的URL

 

得到這些屬性之后,就可以做任何想做的事情。接下來,通過一個完整的實例,來演示一下 localStorage 的 storage 事件機制。

 

假設有 save.html 和 show.html 兩個頁面,在 save 頁面觸發數據改變,在 show 頁面通過彈窗將相關信息顯示出來。

 

在 save 頁面中,有一個文本框和一個保存按鈕,用戶在文本框中輸入數據后,點擊保存按鈕,就會調用 saveItem() 函數將用戶的輸入保存到本地存儲中。代碼如下:

<input type="text" id="data" placeholder="input date to save"> 

<button onClick="saveItem()">保存</button>

<script>

function saveItem() {

    var data = document.getElementById("data").value;   

    localStorage.setItem("data", data);

}

</script>

在 show 頁面中,注冊事件監聽函數,來監聽 storage 事件,因為它關心存儲區域內容的變化:

 

<script>

if (window.addEventListener) {

    window.addEventListener("storage", showStorage);

} else {

    window.attachEvent("onstorage", showStorage);

}

function showStorage(e) {

    if (!e) {

      e = window.event;

    }

    var str = "key: " + e.key +

       "\nnewValue: " + e.newValue +

       "\noldValue: " + e.oldValue +

       "\nurl: " + e.url +

       "\nstorageArea: " + e.storageArea;

    

  alert(str);      

}

</script>

此時,如果 save 頁面改變了存儲區域的內容,就會自動觸發 storage 事件,並把它發送給所有監聽 storage 事件的頁面。

需要注意的是,只有在數據的內容確實發生改變的時候,才會觸發 storage 事件。如果把一個值設置成一模一樣的值,或刪除一個根本就不存在的存儲項,則不會觸發 storage 事件。並且,storage 事件只會發送給同源、而且處於打開狀態的其它頁面,而不會發送給觸發改變的頁面本身(即 save.html)及處於關閉狀態的頁面。因此,應當從Web服務器上獲取本實例的頁面。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM