[解決済み] ブラウザのsessionStorage。タブ間で共有?
2022-04-19 09:36:35
質問
私のサイトには、ブラウザを閉じたときに消去したい値があります。私は
sessionStorage
を使用して、これらの値を保存します。タブが閉じられると、それらは確かにクリアされ、ユーザーがf5を押すと保持されます。しかし、ユーザーが別のタブで何らかのリンクを開くと、これらの値は使用できなくなります。
どのようにすれば
sessionStorage
の値は、私のアプリケーションですべてのブラウザタブ間で使用できますか?
使用例:あるストレージに値を置き、その値をすべてのブラウザタブでアクセス可能にしておき、すべてのタブを閉じたらその値を消去する。
if (!sessionStorage.getItem(key)) {
sessionStorage.setItem(key, defaultValue)
}
解決方法は?
localStorage とその "storage"eventListener を使用すると、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、サファリ、IE11、IE10、IE9でテストしました。
この方法はIE8で動作するはずですが、私のIEはタブを開くたびに...どんなタブでも...どんなウェブサイトでもクラッシュしてしまうので、テストすることができませんでした。(古き良きIE) PS: IE8をサポートしたい場合は、明らかにJSON shimを含める必要があります。)
クレジットはこちらの記事全文をご覧ください。 http://blog.guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/
関連
-
fetch ネットワークリクエストラッパーの説明例
-
JavaScriptのStringに関する共通メソッド
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] 画面サイズ、現在のウェブページ、ブラウザウィンドウのサイズを取得する
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み] ブラウザのビューポート寸法を取得する方法を教えてください。
-
[解決済み] localStorage、sessionStorage、session、cookieの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueの「データを聴く」原則を解説
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
JSクリックイベント - Uncaught TypeError: プロパティ 'onclick' に null を設定できません。
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方
-
[解決済み] localStorage、sessionStorage、session、cookieの違いは何ですか?
-
[解決済み] ブラウザウィンドウ/タブを閉じたときに、localStorageの項目を削除するには?
-
[解決済み】タブやウィンドウ間の通信について