質問されてから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]が存在するため、ローカルストレージは消去されません