質問されてから6年後にこの質問を調べたところ、この質問に対する答えはまだ十分ではないことがわかりました。これにより、次のすべてが達成されます。
- ブラウザ(またはドメインのすべてのタブ)を閉じた後、ローカルストレージをクリアする
- 少なくとも1つのタブがアクティブなままの場合、タブ間でローカルストレージを保持する
- 1つのタブを再読み込みするときにローカルストレージを保持する
上記を実現するために、各ページのロードの開始時にこのJavaScriptを実行します。
((nm,tm) => {
const
l = localStorage,
s = sessionStorage,
tabid = s.getItem(tm) || (newid => s.setItem(tm, newid) || newid)((Math.random() * 1e8).toFixed()),
update = set => {
let cur = JSON.parse(l.getItem(nm) || '{}');
if (set && typeof cur[tabid] == 'undefined' && !Object.values(cur).reduce((a, b) => a + b, 0)) {
l.clear();
cur = {};
}
cur[tabid] = set;
l.setItem(nm, JSON.stringify(cur));
};
update(1);
window.onbeforeunload = () => update(0);
})('tabs','tabid');
編集:ここでの基本的な考え方は次のとおりです。
- 最初から開始すると、セッションストレージには、呼び出されたキーのランダムなIDが割り当てられます
tabid
- 次に、ローカルストレージは、
tabs
キーtabid
が1に設定されているオブジェクトを含むと呼ばれるキーで設定されます。
- タブがアンロードされると、ローカルストレージが0に設定
tabs
されたオブジェクトに更新tabid
されます。
- タブが再ロードされると、最初にアンロードされて再開されます。セッションストレージのキー
tabid
が存在し、ローカルストレージtabs
のサブキーを持つローカルストレージキーも存在するため、tabid
クリアされません。
- ブラウザがアンロードされると、すべてのセッションストレージがクリアされます。セッションを再開すると、ストレージ
tabid
はもう存在せず、新しいものtabid
が生成されます。ローカルストレージにはthisのサブキーがないため、tabid
他のtabid
(すべてのセッションが閉じられていたため)、クリアされています。
- 新しく作成されたタブで
tabid
は、セッションストレージに新しいタブが生成されますが、少なくとも1つのtabs
[ tabid
]が存在するため、ローカルストレージは消去されません