Meu caso: localStorage com chave + valor que deve ser excluído quando o navegador estiver fechado e não em uma única guia.
Por favor, veja meu código se for adequado 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;
});
javascript
jquery
html
local-storage
Yosef
fonte
fonte
undefined
sobrescreveria o item armazenado anteriormente. Mas sim, usar.removeItem()
é mais apropriado.localStorage.clear();
se você quiser limpar todo o armazenamento.Respostas:
deve ser feito assim e não com o operador delete:
fonte
delete localStorage.key
funciona tão bem quantolocalStorage.removeItem(key)
. Parece mais claro para mim usar delete quando eu definir minhas variáveis como emlocalStorage.key = 1
vez delocalStorage.setItem('key', 1)
.localStorage.removeItem = null;
, criandolocalStorage.removeItem(key);
uma ideia potencialmente ruim.localStorage.key = 1
em primeiro lugar - para evitar este tipo de acidentesUse com
window
a palavra-chave global: -fonte
localStorage.removeItem(key)
funciona bem.Você pode fazer uso do
beforeunload
evento em JavaScript.Usando o vanilla JavaScript, você pode fazer algo como:
Isso excluirá a chave antes que a janela / guia do navegador seja fechada e solicitará que você confirme a ação de fechar a janela / guia. Espero que isso resolva seu problema.
NOTA: O
onbeforeunload
método deve retornar uma string.fonte
Você deve usar o sessionStorage se desejar que a chave seja excluída quando o navegador fechar.
fonte
sessionStorage
é o remédio para o que o solicitante descreve.sessionStorage
, mas o Rascunho do Editor W3C diz: 'O tempo de vida de um contexto de navegação pode não estar relacionado ao tempo de vida do processo real do agente do usuário, pois ele pode suportar a retomada de sessões após uma reinicialização.'Tente usar
Espero que funcione para voce
fonte
localStorage.clear();
Há um caso de uso muito específico no qual qualquer sugestão para usar sessionStorage em vez de localStorage realmente não ajuda. O caso de uso seria algo tão simples quanto ter algo armazenado enquanto você tiver pelo menos uma guia aberta, mas a invalidará se você fechar a última guia restante. Se você precisar que seus valores sejam salvos em guias e janelas, o sessionStorage não o ajudará, a menos que você complique sua vida com os ouvintes, como eu tentei. Enquanto isso, o localStorage seria perfeito para isso, mas faz o trabalho "muito bem", pois seus dados estarão esperando lá, mesmo após a reinicialização do navegador. Acabei usando um código e uma lógica personalizados que aproveitam os dois.
Prefiro explicar do que dar código. Primeiro armazene o que você precisa no localStorage e, em seguida, também no localStorage, crie um contador que conterá o número de guias que você abriu. Isso será aumentado toda vez que a página for carregada e diminuído toda vez que a página for descarregada. Você pode escolher aqui os eventos a serem usados, eu sugiro 'carregar' e 'descarregar'. No momento em que você descarrega, você precisa executar as tarefas de limpeza que deseja quando o contador chegar a 0, o que significa que você está fechando a última guia. Aí vem a parte complicada: eu não encontrei uma maneira confiável e genérica de diferenciar uma recarga ou navegação de página dentro da página e o fechamento da guia. Portanto, se os dados armazenados não forem algo que você possa reconstruir em carga após verificar se esta é sua primeira guia, não será possível removê-lo a cada atualização. Em vez disso, você precisa armazenar um sinalizador no sessionStorage a cada carregamento antes de aumentar o contador de guias. Antes de armazenar esse valor, você pode verificar se ele já possui um valor e, caso contrário, isso significa que você está carregando nesta sessão pela primeira vez, o que significa que você pode fazer a limpeza em carga, se isso o valor não está definido e o contador é 0.
fonte
use sessionStorage
O objeto sessionStorage é igual ao objeto localStorage, exceto que ele armazena os dados para apenas uma sessão. Os dados são excluídos quando o usuário fecha a janela do navegador.
O exemplo a seguir conta o número de vezes que um usuário clicou em um botão na sessão atual:
Exemplo
fonte
fonte
fonte
Embora alguns usuários já tenham respondido a essa pergunta, estou fornecendo um exemplo de configurações de aplicativo para resolver esse problema.
Eu tive o mesmo problema. Estou usando o módulo https://github.com/grevory/angular-local-storage no meu aplicativo angularjs. Se você configurar seu aplicativo da seguinte maneira, ele salvará a variável no armazenamento da sessão em vez do armazenamento local. Portanto, se você fechar o navegador ou a guia, o armazenamento da sessão será removido automaticamente. Você não precisa fazer nada.
Espero que ajude.
fonte
Existem cinco métodos para você escolher:
Você pode usar clear (), esse método, quando chamado, limpa todo o armazenamento de todos os registros desse domínio. Não recebe nenhum parâmetro.
fonte
Aqui está um teste simples para verificar se você possui suporte ao navegador ao trabalhar com armazenamento local:
Funcionou para mim como esperado (eu uso o Google Chrome). Adaptado de: http://www.w3schools.com/html/html5_webstorage.asp .
fonte
Eu não acho que a solução apresentada aqui seja 100% correta, porque o evento window.onbeforeunload é chamado não apenas quando o navegador / guia está fechado (O QUE É NECESSÁRIO), mas também em todos os outros eventos. (QUE PODE NÃO SER NECESSÁRIO)
Consulte este link para obter mais informações sobre a lista de eventos que podem disparar window.onbeforeunload: -
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
fonte
por que não usou sessionStorage?
"O objeto sessionStorage é igual ao objeto localStorage, exceto que ele armazena os dados para apenas uma sessão. Os dados são excluídos quando o usuário fecha a janela do navegador."
http://www.w3schools.com/html/html5_webstorage.asp
fonte
Depois de analisar esta questão seis anos depois de ter sido feita, descobri que ainda não há resposta suficiente para essa pergunta; que deve atingir todos os seguintes itens:
Execute este javascript no início de cada carregamento da página para alcançar o seguinte:
Edit: A idéia básica aqui é a seguinte:
tabid
tabs
contendo um objeto que essas chavestabid
é definida como 1.tabs
é atualizado para um objeto que contémtabid
definido como 0.tabid
existe, atabs
chave de armazenamento local também possui uma subchave detabid
do armazenamento local também não é limpa.tabid
não existe mais e um novotabid
será gerado. Como o armazenamento local não possui uma subchave para issotabid
, nem qualquer outrotabid
(todas as sessões foram fechadas), é limpo.tabid
é gerada no armazenamento da sessão, mas como existe pelo menos umtabs
[tabid
], o armazenamento local não é limpofonte
window.onbeforeunload
não será chamado e o localtabs[tabid]
não será definido como 0 => o armazenamento local nunca será mais limpo. Eu acho que um cão de guarda seria mais apropriado nesse caso, em vez de escrever 1 no carregamento da guia, você deve escrever o carimbo de data / hora atual. Em seguida, na parte de redução, você deve declarar o atraso, pois esse carimbo de data / hora não é muito grande ou substituir por 0, se for. Dessa forma, você não depende da chamada real deonbeforeunload
. A guia só precisa redefinir o watchdog de tempos em tempos para manter a existência de armazenamento local.Esta é uma pergunta antiga, mas parece que nenhuma das respostas acima é perfeita.
Caso deseje armazenar autenticação ou qualquer informação confidencial que seja destruída apenas quando o navegador estiver fechado, você poderá confiar
sessionStorage
elocalStorage
passagem de mensagens entre guias para isso.Basicamente, a ideia é:
localStorage
esessionStorage
estão vazias (se não, você pode limpar alocalStorage
). Você precisará registrar um ouvinte de evento de mensagem nolocalStorage
.sessionStorage
arquivo para armazenar as informações confidenciais e usa-olocalStorage
para armazenar essas informações e, em seguida, exclui-as (você não se importa com o tempo aqui, pois o evento estava na fila quando os dados foram alterados). Qualquer outra guia aberta naquele momento será chamada de volta no evento da mensagem e atualizará seussessionStorage
com as informações confidenciais.sessionStorage
ficará vazia. O código terá que definir uma chave nolocalStorage
(por exemplo:)req
. Qualquer outra guia (todas) será chamada de volta no evento de mensagem, veja essa chave e poderá responder com as informações sigilosassessionStorage
(como em 3), se houver.Observe que esse esquema não depende de
window.onbeforeunload
eventos frágeis (já que o navegador pode ser fechado / travado sem que esses eventos sejam acionados). Além disso, o tempo em que as informações confidenciais são armazenadas nolocalStorage
é muito pequeno (já que você depende da detecção de alterações transcendentes para o evento de mensagem entre guias), portanto, é improvável que essas informações sensíveis vazem no disco rígido do usuário.Aqui está uma demonstração desse conceito: http://jsfiddle.net/oypdwxz7/2/
fonte
Não existe uma maneira de detectar o fechamento do navegador; portanto, provavelmente você não pode excluir o localStorage no fechamento do navegador, mas há outra maneira de lidar com as coisas que você pode usar com o sessionCookies, pois ele destruirá após o fechamento do navegador. Isso foi implementado no meu projeto.
fonte
Você pode simplesmente usar o sessionStorage. Como o sessionStorage permite limpar todos os valores-chave quando a janela do navegador for fechada.
Veja lá: SessionStorage- MDN
fonte
você pode tentar o seguinte código para excluir o armazenamento local:
fonte
localStorage.removeItem(key);
para excluir uma chave.delete
? Eu tentei, e funciona. Existe algum efeito colateral ou algo que não devemos usar excluir? Obrigado.delete
não é a melhor prática emlocalStorage