Meu webapp tem erros de javascript na navegação privada do ios safari:
JavaScript: erro
Indefinido
QUOTA_EXCEEDED_ERR: DOM Exceção 22: Foi feita uma tentativa de adicionar algo ao armazenamento ...
meu código:
localStorage.setItem('test',1)
javascript
html
local-storage
leiyonglin
fonte
fonte
Respostas:
Aparentemente, isso ocorre por design. Quando o Safari (OS X ou iOS) está no modo de navegação privada, parece que
localStorage
está disponível, mas tentar chamarsetItem
gera uma exceção.O que acontece é que o objeto de janela ainda é exposto
localStorage
no espaço para nome global, mas quando você chamasetItem
, essa exceção é lançada. Todas as chamadas pararemoveItem
são ignoradas.Acredito que a correção mais simples (embora ainda não testei esse navegador cruzado) seria alterar a função
isLocalStorageNameSupported()
para testar se você também pode definir algum valor.https://github.com/marcuswestin/store.js/issues/42
fonte
return localStorageName in win && win[localStorageName];
parareturn true
. Então você tem uma função que retorna com segurança verdadeira ou falsa, dependendo da disponibilidade do localStorage. Por exemplo:if (isLocalStorageNameSupported()) { /* You can use localStorage.setItem */ } else { /* you can't use localStorage.setItem */ }
A correção postada no link acima não funcionou para mim. Isso fez:
Derivado de http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5
fonte
window.sessionStorage
está correto. Certamente funciona no meu código. Na verdade, aponte a correção para o problema que você parece conhecer.isLocalStorageNameSupported
e estava verificandowindow.sessionStorage
. Mesmo resultado final, mas foi um pouco confuso. A resposta foi editada para esclarecer.Conforme mencionado em outras respostas, você sempre obterá o QuotaExceededError no modo Navegador privado do Safari no iOS e no OS X quando
localStorage.setItem
(ousessionStorage.setItem
) for chamado.Uma solução é fazer uma verificação try / catch ou Modernizr em cada instância de uso
setItem
.No entanto, se você quiser um calço que simplesmente impeça o lançamento global desse erro, para impedir que o restante do JavaScript seja interrompido, você pode usar o seguinte:
https://gist.github.com/philfreo/68ea3cd980d72383c951
fonte
No meu contexto, apenas desenvolvi uma abstração de classe. Quando meu aplicativo é iniciado, verifico se localStorage está funcionando chamando getStorage () . Esta função também retorna:
No meu código, eu nunca chamo localStorage diretamente. Eu chamo cusSto var global, eu havia inicializado chamando getStorage () .
Dessa forma, ele funciona com navegação privada ou versões específicas do Safari
fonte
Parece que o Safari 11 altera o comportamento e agora o armazenamento local funciona em uma janela do navegador privada. Viva!
Nosso aplicativo da web que costumava falhar na navegação privada do Safari agora funciona perfeitamente. Sempre funcionou bem no modo de navegação privada do Chrome, que sempre permitia gravar no armazenamento local.
Isso está documentado nas notas de versão do Safari Technology Preview da Apple - e nas notas de versão do WebKit - da versão 29, que foi em maio de 2017.
Especificamente:
fonte
Para expandir as respostas de outras pessoas, aqui está uma solução compacta que não expõe / adiciona novas variáveis. Ele não cobre todas as bases, mas deve ser adequado para a maioria das pessoas que desejam que um aplicativo de página única permaneça funcional (apesar de não persistir os dados após a recarga).
fonte
Eu tive o mesmo problema usando o framework Ionic (Angular + Cordova). Sei que isso não resolve o problema, mas é o código para os aplicativos angulares com base nas respostas acima. Você terá uma solução efêmera para o LocalStorage na versão iOS do Safari.
Aqui está o código:
Fonte: https://gist.github.com/jorgecasar/61fda6590dc2bb17e871
Aproveite a sua codificação!
fonte
Aqui está uma solução para o AngularJS usando um IIFE e aproveitando o fato de que os serviços são singletons .
Isso resulta em
isLocalStorageAvailable
ser definido imediatamente quando o serviço é injetado pela primeira vez e evita desnecessariamente a execução da verificação toda vez que o armazenamento local precisar ser acessado.fonte
Acabei de criar este repo para fornecer
sessionStorage
elocalStorage
apresenta para os navegadores não suportados ou deficientes.Navegadores suportados
Como funciona
Ele detecta o recurso com o tipo de armazenamento.
Conjuntos
StorageService.localStorage
parawindow.localStorage
se suportada ou cria um armazenamento de cookies. ConjuntosStorageService.sessionStorage
parawindow.sessionStorage
se suportada ou cria um no armazenamento de memória para SPA, o armazenamento de cookies com características sesión para não SPA.fonte
Aqui está uma versão do serviço Angular2 + para alternativa de armazenamento em memória, você pode simplesmente injetar em seus componentes, com base na resposta de Pierre Le Roux.
fonte
Não use se não for suportado e, para verificar o suporte, chame esta função
fonte
Eu criei um patch para o problema. Simplesmente, estou verificando se o navegador suporta localStorage ou sessionStorage ou não. Caso contrário, o mecanismo de armazenamento será Cookie. Mas o lado negativo é que o Cookie possui uma memória de armazenamento muito pequena :(
fonte
A resposta aceita parece inadequada em várias situações.
Para verificar se o
localStorage
ousessionStorage
é suportado, eu uso o seguinte trecho do MDN .Use este trecho como este e faça o fallback para, por exemplo, usando o cookie:
Fiz o pacote fallbackstorage que usa esse trecho para verificar a disponibilidade de armazenamento e fallback para um MemoryStorage implementado manualmente.
fonte
fonte
O script a seguir resolveu meu problema:
Ele verifica se o localStorage existe e pode ser usado e, no caso negativo, cria um armazenamento local falso e o usa em vez do localStorage original. Entre em contato se precisar de mais informações.
fonte