私の場合:ブラウザが閉じられ、単一タブではないときに削除されるべきkey + valueを持つlocalStorage.
それが適切であれば私のコードを見てください。
//create localStorage key + value if not exist
if(localStorage){
localStorage.myPageDataArr={"name"=>"Dan","lastname"=>"Bonny"};
}
//when browser closed - psedocode
$(window).unload(function(){
localStorage.myPageDataArr=undefined;
});
delete演算子ではなく、そのようにしてください。
localStorage.removeItem(key);
window
グローバルキーワードで使用: -
window.localStorage.removeItem('keyName');
JavaScriptでbeforeunload
イベントを利用することができます。
Vanilla JavaScriptを使用すると、次のようなことができます。
window.onbeforeunload = function() {
localStorage.removeItem(key);
return '';
};
これにより、ブラウザウィンドウ/タブが閉じる前にキーが削除され、ウィンドウ/タブを閉じる操作を確認するように求められます。これであなたの問題が解決することを願っています。
注:onbeforeunload
メソッドは文字列を返します。
ブラウザを閉じるときにキーを削除したい場合は、代わりにsessionStorageを使用してください。
使ってみる
$(window).unload(function(){
localStorage.clear();
});
これがあなたのために働くことを願っています
LocalStorageの代わりにsessionStorageを使用することを提案しても実際には役に立たないという非常に特殊なユースケースがあります。ユースケースは、少なくとも1つのタブを開いている間に何かを保存するのと同じくらい簡単ですが、残りの最後のタブを閉じると無効になります。値をクロスタブとウィンドウに保存する必要がある場合、sessionStorageは、私が試したようにリスナーで生活を複雑にしない限り役に立ちません。それまでの間localStorageはこれには完璧ですが、ブラウザを再起動した後もデータはそこで待機しているので、作業は「うまく」行われます。私はカスタムコードとその両方を利用するロジックを使用することになりました。
説明してからコードを書いてください。最初にlocalStorageに必要なものを保存し、次にlocalStorageにも、開いたタブの数を含むカウンターを作成します。これは、ページがロードされるたびに増加し、ページがアンロードされるたびに減少します。ここで使用するイベントを選択してください。ロードとアンロードをお勧めします。アンロードした時点で、カウンターが0になったら最後のタブを閉じているので、クリーンアップタスクを実行する必要があります。ここで注意が必要なのは、ページのリロードやページ内のナビゲーションとタブを閉じることの違いを見分けるための信頼できる一般的な方法を見つけられなかったことです。そのため、保存したデータが最初のタブであることを確認した後にロード時に再構築できるものではない場合、更新のたびに削除することはできません。代わりに、タブカウンタを増やす前に、ロードするたびにsessionStorageにフラグを格納する必要があります。この値を保存する前に、すでに値があるかどうかを確認することができます。そうでない場合、これは最初にこのセッションにロードすることを意味します。値は設定されず、カウンタは0です。
sessionStorageを使用する
SessionStorageオブジェクトはlocalStorageオブジェクトと同じですが、1つのセッションのデータだけが格納される点が異なります。ユーザーがブラウザウィンドウを閉じると、データは削除されます。
次の例では、現在のセッションでユーザーがボタンをクリックした回数を数えます。
例
if (sessionStorage.clickcount) {
sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1;
} else {
sessionStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "You have clicked the button " +
sessionStorage.clickcount + " time(s) in this session.";
for (let i = 0; i < localStorage.length; i++) {
if (localStorage.key(i).indexOf('the-name-to-delete') > -1) {
arr.Push(localStorage.key(i));
}
}
for (let i = 0; i < arr.length; i++) {
localStorage.removeItem(arr[i]);
}
一部のユーザーは既にこの質問に回答していますが、この問題を解決するためのアプリケーション設定の例を示しています。
私は同じ問題を抱えていました。私は私のangularjsアプリケーションで https://github.com/grevory/angular-local-storage moduleを使用しています。次のようにアプリを設定すると、変数はローカルストレージではなくセッションストレージに保存されます。したがって、ブラウザを閉じるかタブを閉じると、セッションストレージは自動的に削除されます。あなたは何もする必要はありません。
app.config(function (localStorageServiceProvider) {
localStorageServiceProvider
.setPrefix('myApp')
.setStorageType('sessionStorage')
});
それが役立つことを願っています。
なぜsessionStorageを使わなかったのですか?
「sessionStorageオブジェクトはlocalStorageオブジェクトと同じですが、1つのセッションのデータだけが保存される点が異なります。ユーザーがブラウザウィンドウを閉じるとデータが削除されます。」
Window.onbeforeunloadイベントはブラウザ/タブが閉じているとき(WHICH IS REQUIRED)だけでなく他のいくつかのイベントでも呼び出されるので、ここで提示された解決策は100%正しいとは思いません。 (必要ないかもしれません)
Window.onbeforeunloadを発生させることができるイベントのリストに関する詳細については、このリンクを参照してください -
http://msdn.Microsoft.com/ja-jp/library/ms536907(VS.85).aspx
質問の6年後にこの質問を見たところ、この質問に対する十分な答えはまだないことがわかりました。これにより、次のすべてが達成されます。
上記を実現するために、各ページのロードの開始時にこの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');
編集: /ここでの基本的な考え方は次のとおりです。
tabid
と呼ばれるキーでランダムなIDを割り当てられますtabs
というキーで設定され、それらのキーtabid
は1に設定されます。tabs
は、0に設定されたtabid
を含むオブジェクトに更新されます。tabid
が存在するため、ローカルキーのサブキーがtabs
のローカルストレージのtabid
キーも存在するため、ローカルストレージはクリアされません。tabid
はもう存在しなくなり、新しいtabid
が生成されます。ローカルストレージはこのtabid
のサブキーも他のtabid
のサブキーも持っていないので(全てのセッションは閉じられています)、それはクリアされます。tabid
が生成されますが、少なくとも1つのtabs
[tabid
]が存在するため、ローカルストレージは消去されません。ローカルストレージで作業するときにブラウザをサポートしているかどうかを確認するための簡単なテストは次のとおりです。
if(typeof(Storage)!=="undefined") {
console.log("localStorage and sessionStorage support!");
console.log("About to save:");
console.log(localStorage);
localStorage["somekey"] = 'hello';
console.log("Key saved:");
console.log(localStorage);
localStorage.removeItem("somekey"); //<--- key deleted here
console.log("key deleted:");
console.log(localStorage);
console.log("DONE ===");
} else {
console.log("Sorry! No web storage support..");
}
期待通りに動作しました(私はGoogle Chromeを使用しています)。から適応: http://www.w3schools.com/html/html5_webstorage.asp 。
これは古い質問ですが、上記の答えがどれも完璧ではないようです。
ブラウザを閉じたときにのみ破壊される認証や機密情報を保存したい場合は、クロスタブメッセージの受け渡しをsessionStorage
とlocalStorage
に頼ることができます。
基本的には、アイデアは以下のとおりです。
localStorage
とsessionStorage
は両方とも空です(そうでない場合は、localStorage
を消去できます)。メッセージイベントリスナをlocalStorage
に登録する必要があります。sessionStorage
を更新し、この情報を格納するためにlocalStorage
を使用してから削除します(データが変更されたときにイベントがキューに入れられたため、ここでタイミングについては気にしない)。その時点で開かれている他のタブはメッセージイベントに対してコールバックされ、機密情報でそれらのsessionStorage
を更新します。sessionStorage
は空になります。コードはlocalStorage
にキーを設定する必要があります(例:req
)。他のすべてのタブはmessageイベントでコールバックされ、そのキーを見て、もしあればそれらのsessionStorage
からの機密情報で答えることができます。このスキームは壊れやすいwindow.onbeforeunload
イベントに依存しないことに注意してください(これらのイベントが発生しないでブラウザを閉じる/クラッシュさせることができるため)。また、機密情報がlocalStorage
に格納される時間は非常に短いため(クロス集計メッセージイベントのトランジェント変更検出に依存しているため)、そのような機密情報がユーザーのハードドライブに漏れることはほとんどありません。
これはこの概念のデモです: http://jsfiddle.net/oypdwxz7/2/ /