sessionStorage 的數據會在同一網站的多個標簽頁之間共享嗎?這取決於標簽頁如何打開


一直以來,我所以為的 sessionStorage 的生命周期是這樣的:在 sessionStorage 中存儲的數據會在當前瀏覽器的同一網站的多個標簽頁中共享,並在此網站的最后一個標簽頁被關閉后清除。注意:這是錯誤的。

我之所以會這么認為,是因為我寫代碼的時候,sessionStorage 給我的表現就是這樣的。

假設我們有一個 index.html

<!-- 使用一個新標簽頁打開自身,並設置一個 sessionStorage --> <a href="index.html" target="_blank" onclick="sessionStorage.setItem('j', 's')"> open myself </a>

接下來:

  1. 在瀏覽器中打開這個 index.html,我們稱之為標簽頁 A。注意:需要用 http 協議打開!例如 http://localhost/index.html
  2. 點擊頁面上的鏈接,此時會彈出來標簽頁 B。
  3. 在標簽頁 B 中打開控制台並執行 sessionStorage.getItem('j')

控制台會輸出 's',這說明標簽頁 A 和 B 共享了 sessionStorage 中的數據;接下來,先關閉這兩個標簽頁,然后再打開一個標簽頁 C,再讀取一下 j 的值,得到的是 null

這看起來跟本文一開始的說法是一致的,但今天我遇到了一個奇怪的事情……

我們給上面的步驟添加第四步:

  1. 在瀏覽器中打開這個 index.html,我們稱之為標簽頁 A。注意:需要用 http 協議打開!例如 http://localhost/index.html
  2. 點擊頁面上的鏈接,此時會彈出來標簽頁 B。
  3. 在標簽頁 B 中打開控制台並執行 sessionStorage.getItem('j'),得到 's'
  4. 新建一個新標簽頁 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。


免責聲明!

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



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