一直以來,我所以為的 sessionStorage 的生命周期是這樣的:在 sessionStorage 中存儲的數據會在當前瀏覽器的同一網站的多個標簽頁中共享,並在此網站的最后一個標簽頁被關閉后清除。注意:這是錯誤的。
我之所以會這么認為,是因為我寫代碼的時候,sessionStorage 給我的表現就是這樣的。
假設我們有一個 index.html
:
<!-- 使用一個新標簽頁打開自身,並設置一個 sessionStorage --> <a href="index.html" target="_blank" onclick="sessionStorage.setItem('j', 's')"> open myself </a>
接下來:
- 在瀏覽器中打開這個 index.html,我們稱之為標簽頁 A。注意:需要用 http 協議打開!例如 http://localhost/index.html
- 點擊頁面上的鏈接,此時會彈出來標簽頁 B。
- 在標簽頁 B 中打開控制台並執行
sessionStorage.getItem('j')
控制台會輸出 's'
,這說明標簽頁 A 和 B 共享了 sessionStorage 中的數據;接下來,先關閉這兩個標簽頁,然后再打開一個標簽頁 C,再讀取一下 j
的值,得到的是 null
。
這看起來跟本文一開始的說法是一致的,但今天我遇到了一個奇怪的事情……
我們給上面的步驟添加第四步:
- 在瀏覽器中打開這個 index.html,我們稱之為標簽頁 A。注意:需要用 http 協議打開!例如 http://localhost/index.html
- 點擊頁面上的鏈接,此時會彈出來標簽頁 B。
- 在標簽頁 B 中打開控制台並執行
sessionStorage.getItem('j')
,得到's'
- 新建一個新標簽頁 D,然后在地址欄內輸入 http://localhost/index.html 打開同樣的頁面, 然后執行
sessionStorage.getItem('j')
。
按照我的預期,標簽頁 D 得到的應該還是 's'
,畢竟我認為 sessionStorage 的數據是在同一網站的多個標簽頁之間共享的。但是我錯了,得到的結果是 null
。
發生了什么?為什么標簽頁 B 中得到的是 's'
,為什么標簽頁 D 中卻是 null
?
細心的同學可能已經發現了,標簽頁 B 和標簽頁 D 之間唯一的不同就是它們被打開的方式:標簽頁 B 是通過在標簽頁 A 中點擊鏈接打開的,但標簽頁 D 是在瀏覽器地址欄輸入地址打開的。
我趕緊上 MDN 查了一下,上面是這么說的:
...data stored in sessionStorage gets cleared when the page session ends...Opening a page in a new tab or window will cause a new session to be initiated, which differs from how session cookies work.
所以現在我明白了:通過點擊鏈接(或者用了 window.open
)打開的新標簽頁之間是屬於同一個 session 的,但新開一個標簽頁總是會初始化一個新的 session,即使網站是一樣的,它們也不屬於同一個 session。