私はサイトにいくつかの値があり、ブラウザが閉じているときにクリアしたい、その値を保存するためにsessionStorageを選択し、タブが閉じているときにクリアし、ユーザーがf5を押すと保存を続けるが、ユーザーが別のタブでいくつかのリンクを開くとこの値利用できません。アプリケーションですべてのブラウザタブ間でsessionStorage値を共有するにはどうすればよいですか?
ユースケース:何らかのストレージに値を配置し、すべてのブラウザータブでその値にアクセスできるようにし、すべてのタブが閉じている場合はクリアします。
if (!sessionStorage.getItem(key)) {
sessionStorage.setItem(key, defaultValue)
}
LocalStorageとその「storage」eventListenerを使用して、1つのタブから別のタブにsessionStorageデータを転送できます。
このコードは、すべてのタブに存在する必要があります。他のスクリプトの前に実行する必要があります。
// transfers sessionStorage from one tab to another
var sessionStorage_transfer = function(event) {
if(!event) { event = window.event; } // ie suq
if(!event.newValue) return; // do nothing if no value to work with
if (event.key == 'getSessionStorage') {
// another tab asked for the sessionStorage -> send it
localStorage.setItem('sessionStorage', JSON.stringify(sessionStorage));
// the other tab should now have it, so we're done with it.
localStorage.removeItem('sessionStorage'); // <- could do short timeout as well.
} else if (event.key == 'sessionStorage' && !sessionStorage.length) {
// another tab sent data <- get it
var data = JSON.parse(event.newValue);
for (var key in data) {
sessionStorage.setItem(key, data[key]);
}
}
};
// listen for changes to localStorage
if(window.addEventListener) {
window.addEventListener("storage", sessionStorage_transfer, false);
} else {
window.attachEvent("onstorage", sessionStorage_transfer);
};
// Ask other tabs for session storage (this is ONLY to trigger event)
if (!sessionStorage.length) {
localStorage.setItem('getSessionStorage', 'foobar');
localStorage.removeItem('getSessionStorage', 'foobar');
};
私はこれをクローム、ff、サファリ、すなわち11、すなわち10、すなわち9でテストしました
このメソッドは「IE8で動作するはずです」が、タブを開くたびにIEがクラッシュするため、テストできませんでした。 (良いol IE)PS:IE8のサポートも必要な場合は、明らかにJSONシムを含める必要があります。 :)
クレジットはこの記事全体に行きます: http://blog.guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/
これにsessionStorage
を使用することはできません。
MDN Docs から
新しいタブまたはウィンドウでページを開くと、新しいセッションが開始されます。
つまり、タブ間で共有できないため、localStorage
を使用する必要があります
localStorage
を使用するだけで、session cookie
で最初に作成された日付を記憶できます。 localStorage
"session"がcookieの値よりも古い場合、localStorage
をクリアできます
これの短所は、ブラウザを閉じた後でも誰かがデータを読むことができるということです。したがって、データがプライベートで信頼できるものである場合、それは良い解決策ではありません。
データをlocalStorage
に数秒間保存し、storage
イベントのイベントリスナーを追加できます。これにより、タブのいずれかがlocalStorage
に何かを書き込んだことを知ることができ、その内容をsessionStorage
にコピーしてから、localStorage
をクリアすることができます。
実際に他の領域を見ると、_blankで開くと、親が開いているときにタブを開いている限り、sessionStorageが保持されます。
このリンクには、テストするのに適したjsfiddleがあります。 target = "_ blank"でリンクをたどる場合、新しいウィンドウのsessionStorageは空ではありません
SessionStorageをタブで転送できないようにするための私の解決策は、localProfileを作成し、この変数をバングオフすることでした。この変数が設定されているが、sessionStorage変数が先に進み、それらを再初期化する場合。ユーザーがウィンドウを閉じると、このlocalStorage変数が破棄されます