Como remover um item de localização quando a janela/Página do navegador está fechada?

o meu caso: localização com chave + valor que deverá ser apagado quando o navegador estiver fechado e não uma página única.

Por favor, veja o meu código se for apropriado e o que pode ser melhorado:

//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;
});
Author: MT., 2012-03-30

15 answers

Deve ser feito assim e não com o operador de eliminação:

localStorage.removeItem(key);
 616
Author: Yosef, 2013-10-12 08:00:07

Você pode fazer uso do evento beforeunload em JavaScript.

Usando vanilla JavaScript você poderia fazer algo como:
window.onbeforeunload = function() {
  localStorage.removeItem(key);
  return '';
};

Isso irá apagar a chave antes da janela/Página do navegador estar fechada e pede-lhe para confirmar a acção fechar a janela/Página. Espero que isso resolva o teu problema.

Nota: O Método onbeforeunload deve devolver uma cadeia de caracteres.

 86
Author: MT., 2013-01-26 19:40:52

Utilizar com window palavra-chave global: -

 window.localStorage.removeItem('keyName');
 78
Author: vineet, 2018-02-27 06:27:08

Em vez disso, deve usar o suporte da sessão se quiser que a chave seja apagada quando o navegador fechar.

 74
Author: Graou13, 2013-10-12 07:41:41

Tenta usar

$(window).unload(function(){
  localStorage.clear();
});
Espero que isto funcione para ti.
 16
Author: Rafael Marques, 2012-03-30 15:01:26

Existe um caso de Utilização muito específico em que qualquer sugestão de usar a porta de sessão em vez da porta local não ajuda realmente. O caso de uso seria algo tão simples como ter algo armazenado enquanto você tem pelo menos uma aba aberta, mas invalidá-lo se você fechar a última aba restante. Se você precisa que seus valores sejam salvos cross-tab E window, sessionStorage não o ajuda a menos que você complique sua vida com os ouvintes, como eu tentei. Entretanto, a localização local seria perfeito para isso, mas ele faz o trabalho 'muito bem', uma vez que seus dados estarão esperando lá mesmo após um reinício do navegador. Acabei por usar um código personalizado e lógica que se aproveita de ambos.

Prefiro explicar e depois dar o código. Primeiro armazene o que você precisa em localStorage, em seguida, também em localStorage crie um contador que irá conter o número de páginas que você abriu. Isto será aumentado cada vez que a página carrega e diminuiu cada vez que a página descarrega. Podes ter a sua escolha dos eventos a usar, sugiro "carregar" e "descarregar". No momento em que você descarrega, você precisa fazer as tarefas de limpeza que você gostaria quando o contador chega a 0, o que significa que você está fechando a última conta. Aqui vem a parte complicada: eu não encontrei uma maneira confiável e genérica para dizer a diferença entre uma recarga de página ou navegação dentro da página e o fechamento da aba. Então, se os dados que você armazenar não é algo que você pode reconstruir na carga depois de verificar que este é o seu primeiro tab, então você não pode removê-lo em cada atualização. Em vez disso, você precisa armazenar uma bandeira em sessionStorage a cada carga antes de aumentar o contador de Tabs. Antes de armazenar este valor, você pode fazer uma verificação para ver se ele já tem um valor e se ele não, isto significa que está a carregar nesta sessão pela primeira vez, o que significa que pode fazer a limpeza à carga se este valor não estiver definido e o contador for 0.
 11
Author: Solthun, 2014-11-04 16:05:46

Utilizar sessionStorage

O objecto de sessionStorage é igual ao objecto localStorage, excepto que armazena os dados para apenas uma sessão. Os dados são apagados quando o usuário fecha a janela do navegador.

O seguinte exemplo conta o número de vezes que um utilizador carregou num botão, na sessão actual:

Exemplo

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.";
 9
Author: DilanG, 2015-06-26 10:53:53

Aqui está um teste simples para ver se você tem suporte de navegador ao trabalhar com o armazenamento local:

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

Funcionou comigo como esperado (Eu uso o Google Chrome). Adaptado de: http://www.w3schools.com/html/html5_webstorage.asp.

 3
Author: rdonatoiop, 2013-04-28 14:20:24

Não acho que a solução aqui apresentada seja 100% correcta porque a janela.onbeforeunload event is called not only when browser/Tab is closed (WHICH IS REQUIRED), but also on all other several events. (QUE PODE NÃO SER NECESSÁRIO)

Veja este link para mais informações sobre a lista de eventos que podem disparar a janela.onbefore unload: -

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

 3
Author: miztaken, 2013-07-08 20:34:19

Porque não usar o suporte da sessão?

" o objecto de sessionStorage é igual ao objecto localStorage, excepto que armazena os dados para apenas uma sessão. Os dados são apagados quando o usuário fecha a janela do navegador."

Http://www.w3schools.com/html/html5_webstorage.asp

 3
Author: wjfinder77, 2014-12-15 16:25:25

Embora alguns utilizadores já tenham respondido a esta pergunta, estou a dar um exemplo de configurações de aplicação para resolver este problema.

Eu tinha o mesmo problema. Estou a usar https://github.com/grevory/angular-local-storage Módulo na minha aplicação angularjs. Se configurar o seu aplicativo da seguinte forma, ele irá gravar variável no armazenamento de sessão em vez de armazenamento local. Portanto, se você fechar o navegador ou fechar a página, o armazenamento de sessão será removido automaticamente. Você não preciso de fazer qualquer coisa.
app.config(function (localStorageServiceProvider) {
  localStorageServiceProvider
  .setPrefix('myApp')
  .setStorageType('sessionStorage')
});
Espero que ajude.
 3
Author: user1012513, 2017-04-03 13:25:02
        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]);
      }
 2
Author: Gil Snovsky, 2018-05-17 10:50:21
[[[2]] Depois de olhar para esta pergunta 6 anos depois que ela foi feita, eu descobri que ainda não há resposta suficiente para esta pergunta; que deve alcançar todos os seguintes:
  • limpar o armazenamento Local após fechar o navegador (ou todas as páginas do domínio)
  • preservar o armazenamento Local através das páginas, se pelo menos uma das páginas permanecer activa
  • preservar a Armazenagem Local ao carregar uma única página

Execute este pedaço de javascript no início de cada carregamento de páginas em a fim de alcançar o acima exposto:

((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');
 0
Author: Hacktisch, 2018-09-07 11:12:14

Pode tentar o seguinte código para remover o armazenamento local:

delete localStorage.myPageDataArr;
 -3
Author: aztechy, 2017-12-19 12:17:26

Isto vai funcionar como um encanto se u estiver a usar AngularJS

$localStorage.$reset(); 
 -4
Author: shreedhar bhat, 2018-06-01 18:10:33