Tarayıcı penceresi / sekmesi kapatıldığında bir localStorage öğesi nasıl silinir?


403

Benim Durumum: tarayıcı kapalıyken ve tek sekme değil silinmesi gereken anahtar + değere sahip localStorage.

Kodum uygunsa ve ne geliştirilebilir bakın:

//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;
});

32
Tarayıcı kapatıldıktan sonra yerel depolamayı temizlemek isterseniz, kullanım nedenlerinizi sorgularım.
Dunhamzzz

16
Hem yerel hem de oturum depolama nesneleriniz olabilir; oturum değerleri için sessionStorage'ı kullanırdım. Btw, bir değeri undefined olarak ayarlamak değeri silmez veya localStorage öğesinden kaldırır, sadece değerini undefined olarak ayarlar.
kennebec

2
@kennebec - undefinedDaha önce saklanan öğenin üzerine yazılacak ayar . Ama evet, kullanmak .removeItem()daha uygun.
nnnnnn

2
localStorage yerine sessionStorage kullanın
Alberto Acuña

2
localStorage.clear(); Tüm depolama alanını temizlemek istiyorsanız kullanın .
Black Mamba

Yanıtlar:


802

delete operatörü ile değil, böyle yapılması gerekir:

localStorage.removeItem(key);

1
Neden silme işlecini tam olarak kullanamıyoruz? Testlerimden, bu delete localStorage.keykadar iyi çalışıyor gibi görünüyor localStorage.removeItem(key). Ben gibi benim değişkenleri ayarlarken silme kullanmak bana daha net görünüyor localStorage.key = 1ziyade localStorage.setItem('key', 1).
Aust

6
Çalışırsa, teknik olarak kullanabilirsiniz. Ancak removeItem öğesinin bir üye işlevi olarak sağlandığı düşünüldüğünde, ayrı bir işleç kullanarak potansiyel olarak tanımlanmamış davranışla karşılaşmak yerine onu kullanmak mantıklı görünmektedir.
kungphu

@kungphu potansiyel olarak kötü bir fikir localStorage.removeItem = null;yaparak , her zaman (yanlışlıkla) yapabileceğinizi unutmayın localStorage.removeItem(key);.
skeggse

31
Bunun nasıl planlanacağını makul bir ihtimal olarak görmüyorum. Bir dilin insanların yıkıcı şeyler yapmasına izin vermesi, kütüphaneleri dilin yanlış kullanımına karşı bir savunma olarak kullanmanın standart dışı yollarını benimsemeniz gerektiği anlamına gelmez. Siz veya diğer geliştiricileriniz çağırma ve atama arasındaki farkı anlamıyorsa, localStorage'dan öğeleri en iyi şekilde nasıl kaldıracağınızdan çok daha büyük sorunlarınız var.
kungphu

3
@skeggse bu yüzden localStorage.key = 1ilk etapta yazmak kötü bir fikir - bu tür kazaları önlemek için
Jivan

114

windowGlobal anahtar kelimeyle kullanın : -

 window.localStorage.removeItem('keyName');

6
Neden Window Object kullanılır? sadece iyi localStorage.removeItem(key)çalışıyor.
Pardeep Jain

3
bu bağlantıya göz
atın

Bu çözüm IE 11 için gerçekten işe yarıyor mu? Lütfen önerin. Açısal 5 kodunda bu sorun yaşıyorum.
Karan

95

Sen yararlanabilirler beforeunloadJavaScript olay.

Vanilya JavaScript kullanarak aşağıdakileri yapabilirsiniz:

window.onbeforeunload = function() {
  localStorage.removeItem(key);
  return '';
};

Bu, tarayıcı penceresi / sekmesi kapatılmadan önce anahtarı siler ve pencereyi / sekmeyi kapat eylemini onaylamanızı ister. Umarım sorununuzu çözer.

Not: onbeforeunloadyöntem bir dize döndürmelidir.


Bu gerçekten işe yaradı. Cevabı kabul etmek güzel olabilir (bunca zamandan sonra bile).
Richard Morgan

8
@dhsto VanillaJS açık JavaScript :) Buraya bakın: VanillaJS nedir? .
Bharat Khatri

1
Bir sorun, sadece sekme kapatıldığında değil, aynı sayfada gezinseniz bile çağrılmasıdır, bu amaçlanan şey olmayabilir. Yan not: onbeforeunload'dan tanımsız olarak döndürüldüğünde, boşaltma sırasında gösterilen mesaj devre dışı bırakılır.
Stan Bondi

Kullanıcı sayfada kalmak istiyorsa ve yerel depolamayı zaten silerseniz ne olur? Ayrıca çözüm Chrome ve IE11 üzerinde çalışmıyor
oracleruiz

Neden sessionStorage kullanmıyorsunuz?
Sachin Prasad

94

Tarayıcı kapatıldığında anahtarın silinmesini istiyorsanız sessionStorage'ı kullanmalısınız.


3
Bu en iyi cevap; sessionStorageaskerin tarif ettiklerinin çaresi.
Benny

8
Bahsetmek için +1 sessionStorage, ancak W3C Editörün Taslağı şunları söylüyor: 'Kullanıcı aracısı yeniden başlatmadan sonra oturumları sürdürmeyi destekleyebileceğinden, bir göz atma bağlamının ömrü gerçek kullanıcı aracısı sürecinin kendisiyle ilişkili olmayabilir.'
Tamás

28
'SessionStorage' ile ilgili sorun, yeni bir sekme açtığınızda saklanmamasıdır, örneğin ctrl ile bir bağlantıyı tıklayın. Bir localStorage / sessionStorage hibrit lol ihtiyacım var.
Edwin Stoteler

3
@EdwinStoteler Ben de. Bu şekilde tasarladıklarında ne düşündüklerini biraz karıştırıyorum. Gerçekten, tarayıcı kapatıldığında yok edilen yalnızca bellek içi bir tarayıcı deposuna erişmem gerekiyor. Hassas bilgileri tüm etki alanında erişilebilecek şekilde depolamak istiyorum, ancak bu bilgilerin sabit disklere çarpmasını istemiyorum.
BT

19

Kullanmayı deneyin

$(window).unload(function(){
  localStorage.clear();
});

Umarım bu senin için çalışır


2
localStorage'ın tamamını silmek istiyor musunuz? öyleyse sadece kullanınlocalStorage.clear();
Rafael Marques

ne sormak istediğini açıktı - anahtar sadece + değeri silmek
Yosef

12
Bu, tüm yerel depoları temizleyecektir. kötü çözüm!
Emmy

12

LocalStorage yerine sessionStorage kullanmak için herhangi bir önerinin gerçekten yardımcı olmadığı çok özel bir kullanım durumu vardır. Use-case, en az bir sekme açılmışken depolanan bir şeyi saklamak kadar basit bir şey olabilir, ancak kalan son sekmeyi kapatırsanız geçersiz kılın. Değerlerinizin çapraz sekme ve pencereye kaydedilmesi gerekiyorsa, denediğim gibi dinleyicileri ile hayatınızı zorlaştırmazsanız sessionStorage size yardımcı olmaz. Bu arada localStorage bunun için mükemmel olurdu, ancak 'tarayıcınızı yeniden başlattıktan sonra bile verileriniz orada bekleyeceği için işi' çok iyi 'yapıyor. Her ikisinden de yararlanan özel bir kod ve mantık kullanarak sona erdi.

Açıklamayı tercih edip kod vermeyi tercih ederim. Önce localStorage'da ihtiyacınız olanı saklayın, ardından localStorage'da açtığınız sekmelerin sayısını içeren bir sayaç oluşturun. Bu, sayfa her yüklendiğinde artar ve sayfa her yüklendiğinde azalır. Kullanılacak olayları burada seçebilirsiniz, 'yükle' ve 'kaldır' öneririm. Boşaltma sırasında, sayaç 0'a ulaştığında yapmak istediğiniz temizleme görevlerini yapmanız gerekir, yani son sekmeyi kapatırsınız. İşte zor kısmı geliyor: Bir sayfanın yeniden yüklenmesi veya sayfa içinde gezinme ile sekmenin kapatılması arasındaki farkı anlatmanın güvenilir ve genel bir yolunu bulamadım. Dolayısıyla, depoladığınız veriler, bunun ilk sekmeniz olup olmadığını kontrol ettikten sonra yük üzerinde yeniden oluşturabileceğiniz bir şey değilse, her yenileme işleminde kaldıramazsınız. Bunun yerine, sekme sayacını artırmadan önce sessionStorage'da her yükte bir bayrak depolamanız gerekir. Bu değeri saklamadan önce, zaten bir değere sahip olup olmadığını kontrol edebilirsiniz ve eğer yoksa, bu oturuma ilk kez yüklediğiniz anlamına gelir, yani eğer yükü temizlerseniz değeri ayarlanmadı ve sayaç 0.


"Neden sessionStorage kullanılmıyor?" Ayrıca, w3schools.com/html/html5_webstorage.asp : "window.sessionStorage - bir oturum için verileri saklar (sekme kapatıldığında veriler kaybolur)". Yani cevap tam da bu. sessionStorage, tarif ettiğim kullanım bölümünde bile kalıcı bir şey istiyorsanız işe yaramaz.
Solthun

3
Bunun için en iyi uygulamanın, temel olarak diğer bileşenlerin dinleyebileceği olayları tetikleyen bir tarayıcıWatcher hizmeti olacağını düşünüyorum (yani tarayıcı açık, tarayıcı kapat, broswer-yük, tarayıcı kaldırma vb. Ve içindeki tüm bu uygulama ayrıntılarını gizleyin Her bileşen, çalışmasını yapmak için hangi olayları gerçekleştirmesi gerektiğine karar verebilir.Tek sorum, makineye güç kesildiğinde veya başka bir şey olursa ne olacağı olurdu, o zaman bu özellikler tarayıcı bir sonraki açıldığında localStorage'da kalacaktı. ?
pQuestions123

11

sessionStorage kullan

SessionStorage nesnesi, verileri yalnızca bir oturum için depolaması dışında localStorage nesnesine eşittir. Kullanıcı tarayıcı penceresini kapattığında veriler silinir.

Aşağıdaki örnek, bir kullanıcının geçerli oturumda bir düğmeyi kaç kez tıkladığını sayar:

Misal

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.";

1
Veriler tarayıcı sekmesi kapatıldığında silinir.
Kosmonaft

7
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]);
}

5
localStorage.removeItem(key);  //item

localStorage.clear(); //all items

1
Eski bir soruyu cevaplarken, özellikle de zaten kabul edilmiş bir cevabı olan bir soru için, cevabınızın nasıl yardımcı olduğunu açıklamak için bir bağlam eklediyseniz, cevabınız diğer StackOverflow kullanıcıları için çok daha yararlı olacaktır. Bakınız: İyi bir cevabı nasıl yazarım .
Tân

Bana yeterince açık görünüyor
Giorgio Tempesta

4

Bazı kullanıcılar zaten bu soruyu zaten cevaplamış olsa da, bu sorunu çözmek için uygulama ayarlarına bir örnek veriyorum.

Aynı sorunu yaşadım. Angularjs uygulamamda https://github.com/grevory/angular-local-storage modülünü kullanıyorum . Uygulamanızı aşağıdaki gibi yapılandırırsanız, yerel depolama yerine oturum depolama alanına değişkeni kaydeder. Bu nedenle, tarayıcıyı kapatır veya sekmeyi kapatırsanız, oturum depolama alanı otomatik olarak kaldırılır. Hiçbir şey yapmanıza gerek yok.

app.config(function (localStorageServiceProvider) {
  localStorageServiceProvider
  .setPrefix('myApp')
  .setStorageType('sessionStorage')
});

Umarım yardımcı olur.


4

Seçim yapabileceğiniz beş yöntem vardır:

  • setItem (): localStorage öğesine anahtar ve değer ekleyin
  • getItem (): localStorage öğesinden anahtarla bir değer al
  • removeItem (): Bir öğeyi localStorage öğesinden anahtarla kaldırın
  • clear (): Tüm localStorage öğelerini temizle
  • key (): Bir localStorage öğesinin n'inci anahtarını almak için bir sayı iletti

Çağrıldığında clear (), bu yöntemi kullanarak söz konusu alan için tüm kayıtların tüm depolama alanını temizler. Herhangi bir parametre almaz.

window.localStorage.clear();

3

Yerel depolama ile çalışırken tarayıcı desteğiniz olup olmadığını görmek için basit bir test:

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..");
}

Benim için beklendiği gibi çalıştı (Google Chrome kullanıyorum). Uyarlanmış: http://www.w3schools.com/html/html5_webstorage.asp .


3

Burada sunulan çözüm% 100 doğru olduğunu düşünmüyorum çünkü window.onbeforeunload olayı yalnızca tarayıcı / Sekme kapatıldığında (HANGİ GEREKLİ) değil, aynı zamanda diğer tüm olaylarda da çağrılır. (GEREKLİ OLMAYANLAR)

Pencereyi ateşleyebilecek olayların listesi hakkında daha fazla bilgi için bu bağlantıya bakın.

http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx


Haklı olabilirsiniz, ancak yine de gönderdiğiniz şey bir yorum değil, bir cevaptır.
nnnnnn


3

Sorulduktan 6 yıl sonra bu soruya baktıktan sonra, bu soruya hala yeterli bir cevap olmadığını buldum; ve aşağıdakilerin tümünü gerçekleştirmelidir:

  • Tarayıcıyı (veya alanın tüm sekmelerini) kapattıktan sonra Yerel Depolamayı Temizle
  • En az bir sekme etkin kalırsa Yerel Depolamayı sekmeler arasında koruyun
  • Tek bir sekmeyi yeniden yüklerken Yerel Depolamayı koru

Yukarıdakilere ulaşmak için bu javascript parçasını her sayfa yükünün başlangıcında yürütün:

((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');

Düzenleme: Buradaki temel fikir şudur:

  1. Sıfırdan başlarken, oturum depolama alanına şu anahtarda rastgele bir kimlik atanır: tabid
  2. Daha sonra yerel depolama, tabsbu anahtarı bir nesne içeren adlı bir anahtarla ayarlanır.tabid 1 olarak ayarlanır.
  3. Sekme kaldırıldığında, yerel depolama tabsalanları aşağıdakileri içeren bir nesneye güncellenirtabid alanları 0 olarak ayarlanmış .
  4. Sekme yeniden yüklenirse, önce kaldırılır ve devam ettirilir. Oturum depolama alanı anahtarı tabidbulunduğundan, yerel depolama tabsanahtarı databid temizlenmez.
  5. Tarayıcı kaldırıldığında, tüm oturum depolama alanları silinir. Oturum yeniden başlatıldığında tabidartık depolama alanı mevcut olmaz ve yeni bir tabidveri oluşturulur. Yerel depolama biriminin bunun için bir alt anahtarı tabidveya başka herhangi bir anahtarı olmadığındantabid oturumu olmadığından (tüm oturumlar kapatıldı) temizlendi.
  6. Yeni oluşturulan bir sekmede, tabidoturum deposunda yeni bir oluşturulur, ancak en az bir tabs[ tabid] bulunduğundan, yerel depolama alanı temizlenmez

1
Ancak tarayıcı çökerse, çağrılamaz window.onbeforeunloadve yerel tabs[tabid]0 => olarak ayarlanmaz, artık yerel depolama alanı artık temizlenmez. Bu durumda bir bekçi köpeği daha uygun olacağını düşünüyorum, sekme yüklemesi üzerine 1 yazmak yerine, geçerli zaman damgasını yazmalısınız. Daha sonra azaltma kısmında, zaman damgası çok büyük olmadığından gecikmeyi onaylamanız veya varsa 0 ile değiştirmeniz gerekir. Bu şekilde, fiili çağrıya bağımlı değilsiniz onbeforeunload. Sekmenin , yerel depolama varlığını korumak için zaman zaman bekçi köpeğini sıfırlaması yeterlidir .
16ryl199 16:19

1

Bu eski bir soru, ama yukarıdaki cevabın hiçbiri mükemmel görünmüyor.

Eğer güvenebileceğiniz, mağaza kimlik doğrulama veya tarayıcı kapatıldığında sadece tahrip olan hassas bilgilere istiyoruz sessionStoragevelocalStorage çapraz sekme Mesaj yollama için.

Temel olarak, fikir:

  1. Açılan önceki sekmeden önyükleme yaparsınız, böylece hem sizin localStoragehem sessionStoragede boştur (eğer değilse, temizleyebilirsiniz localStorage). Cihazınıza bir mesaj etkinliği dinleyicisi kaydetmeniz gerekir.localStorage .
  2. Kullanıcı bu sekmede (veya alan adınızda açılan herhangi bir sekmede) hassas bir bilginin kimliğini doğrular / oluşturur.
  3. sessionStorageHassas bilgileri depolamak için güncelleştirin ve localStoragebu bilgileri saklamak için kullanın ve sonra silin (veri değiştiğinde olay kuyruğa girdiğinden, burada zamanlama ile ilgilenmezsiniz). O sırada açılan diğer sekmeler ileti etkinliğinde geri çağrılacak sessionStorageve hassas bilgilerle güncellenecektir .
  4. Kullanıcı alan adınızda yeni bir sekme açarsa sessionStorageboş olur. Kodun localStorage(örnek: için req) bir anahtarı ayarlaması gerekir . Diğer tüm sekmeler mesaj etkinliğinde geri çağrılacak, o anahtara bakacak ve sessionStorageeğer varsa, (3'teki gibi) hassas bilgilerle cevaplayabilecektir .

Bu şemanın window.onbeforeunloadkırılgan bir olaya bağlı olmadığını lütfen unutmayın (tarayıcı bu olaylar tetiklenmeden kapatılabilir / çökebilir). Ayrıca, hassas bilgilerinlocalStorage çok küçüktür (çapraz sekme mesajı olayı için transcients değişiklik algılamasını kullandığınızdan), bu nedenle bu tür hassas bilgilerin kullanıcının sabit diskine sızması olası değildir.

İşte bu kavramın bir demosu: http://jsfiddle.net/oypdwxz7/2/


Düzenleme için teşekkür ederim xryl669, iyi bir noktaya değindiniz. Şimdi bunu düşündüğümde, paylaşılan bir web çalışanını kullanmak belki de en iyisi olabilir mi? Mevcut tarayıcı desteğinin sorun olmaması durumunda developer.mozilla.org/tr-TR/docs/Web/API/SharedWorker
Hacktisch

Evet, ilk ikisi Edge'de bulunmasa da, SharedWorker veya BroadcastChannel (veya bunun gibi bir localStorage) kullanabilirsiniz. Temel olarak, çapraz sekme, çapraz pencere olan herhangi bir yöntem işe yarardı. Zorluk, her yerde en az güçlükle çalışan birini bulmaktır.
xryl669

1

Tarayıcı kapatmayı algılamanın böyle bir yolu yoktur, bu nedenle muhtemelen tarayıcı kapatıldığında localStorage'ı silemezsiniz, ancak tarayıcı kapatıldıktan sonra yok edeceği için sessionCookies'i kullanabileceğiniz şeyleri işlemenin başka bir yolu vardır.


0

SessionStorage'ı kullanabilirsiniz. Çünkü sessionStorage, tarayıcı penceresi kapatıldığında tüm anahtar değerlerinin temizlenmesine izin verir.

Oraya bakınız: SessionStorage- MDN


-5

yerel depolamayı silmek için aşağıdaki kodu deneyebilirsiniz:

delete localStorage.myPageDataArr;

29
Bir localStorage anahtarını silmenin doğru yolu bu değildir. localStorage.removeItem(key);Bir anahtarı silmek için kullanmalısınız .
MT.

1
LocalStorage.removeItem (anahtar) kullanmalı; delete anahtar kelimesi değil.
Rob Evans

@MT. Neden kullanmıyorsunuz delete? Denedim ve işe yarıyor. Herhangi bir yan etkisi var mı yoksa silmememiz gereken bir şey var mı? Teşekkür ederim.
user1995781

2
@ user1995781 kullanarak deleteen iyi uygulama değillocalStorage
justmyfreak

1
@justmyfreak Bu bir cevap değil
alvitawa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.