O uso do LocalStorage no iPhone com iOS 7 gera esse erro. Estive procurando um resolvente, mas, considerando que nem estou navegando em particular, nada é relevante.
Não entendo por que o localStorage seria desativado por padrão no iOS 7, mas parece que é? Também testei em outros sites, mas sem sorte. Até tentei testá-lo usando este site: http://arty.name/localstorage.html , mas não parece que ele esteja salvando nada por algum motivo estranho.
Alguém já teve o mesmo problema, mas teve sorte em consertá-lo? Devo mudar meu método de armazenamento?
Tentei fazer uma depuração difícil armazenando apenas algumas linhas de informação, mas sem sucesso. Eu usei a localStorage.setItem()
função padrão para salvar.
Respostas:
Isso pode ocorrer quando o Safari está na navegação em modo privado. Enquanto estiver navegando em particular, o armazenamento local não está disponível.
Uma solução é avisar o usuário que o aplicativo precisa do modo não privado para funcionar.
ATUALIZAÇÃO: Isso foi corrigido no Safari 11 , então o comportamento agora está alinhado com outros navegadores.
fonte
if( typeof Storage != 'undefined' ) { ... }
) antes de tentar carregar e salvar informações, mas obtendo esse erro. Acontece queStorage
ainda está definido, mesmo quando é inutilizável. Usando try / catch a partir de agora, sempre que eu usar o LocalStorage.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 a execução desse erro globalmente, para impedir que o restante do JavaScript seja interrompido, você pode usar o seguinte:
https://gist.github.com/philfreo/68ea3cd980d72383c951
fonte
Eu uso essa função simples, que retorna
true
oufalse
, para testar a disponibilidade do localStorage:Agora você pode testar a
localStorage.setItem()
disponibilidade antes de usá-lo. Exemplo:fonte
window.sessionStorage
foi usado em vez dewindow.localStorage
para um método chamadoisLocalStorageNameSupported
?HTML local storage provides two objects for storing data on the client: window.localStorage - stores data with no expiration date window.sessionStorage - stores data for one session (data is lost when the browser tab is closed)
sessionStorage
torna mais gerenciável para definir pontos de interrupção, se você quiser testar seu desenvolvimento. Não há argumento verdadeiro para o que é "melhor" e é realmente apenas uma preferência pessoal que erra do lado da cautela. O principal a observar é que ambassessionStorage
elocalStorage
são implementações da API de armazenamento da web HTML5.Por acaso corri com o mesmo problema no iOS 7 (com alguns dispositivos sem simuladores).
Parece que o Safari no iOS 7 tem uma cota de armazenamento mais baixa, que aparentemente é atingida por um longo histórico de log.
Acho que a melhor prática será capturar a exceção.
O projeto Modernizr tem um patch fácil, você deve tentar algo semelhante: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
fonte
Aqui está uma solução expandida com base na resposta de DrewT acima que usa cookies se localStorage não estiver disponível. Ele usa a biblioteca docCookies do Mozilla :
Na sua fonte, basta usar:
fonte
Como já explicado em outras respostas, quando estiver no modo Navegação privada, o Safari sempre lançará essa exceção ao tentar salvar dados com
localStorage.setItem()
.Para corrigir isso, escrevi um localStorage falso que imita o localStorage, métodos e eventos.
Local falsoStorage: https://gist.github.com/engelfrost/fd707819658f72b42f55
Provavelmente, essa não é uma boa solução geral para o problema. Essa foi uma boa solução para o meu cenário, onde a alternativa seria reescrever muito em um aplicativo já existente.
fonte
Atualização (01/11/2016)
Eu estava usando o AmplifyJS mencionado abaixo para solucionar esse problema. No entanto, para o Safari na navegação privada, ele voltava a um armazenamento baseado em memória. No meu caso, não era apropriado porque significa que o armazenamento é limpo na atualização, mesmo se o usuário ainda estiver na navegação privada.
Além disso, notei vários usuários que estão sempre navegando no modo Privado no iOS Safari. Por esse motivo, uma alternativa melhor para o Safari é usar cookies (se disponível). Por padrão, os cookies ainda estão acessíveis, mesmo na navegação privada. Obviamente, eles são limpos ao sair da navegação privada, mas não são limpos na atualização.
Encontrei a biblioteca local-storage-fallback . A partir da documentação:
Cuidado com as dicas:
TL; DR:
Use local-storage-fallback (API unificada com
.getItem(prop)
e.setItem(prop, val)
):Resposta original
Para adicionar respostas anteriores, uma solução possível seria alterar o método de armazenamento. Existem algumas bibliotecas como AmplifyJS e PersistJS que podem ajudar. Ambas as bibliotecas permitem armazenamento persistente do lado do cliente através de vários back-ends.
Para AmplifyJS
For PersistentJS
Eles oferecem uma camada de abstração para que você não precise se preocupar em escolher o tipo de armazenamento. Lembre-se de que pode haver algumas limitações (como limites de tamanho), dependendo do tipo de armazenamento. No momento, estou usando o AmplifyJS, mas ainda preciso fazer mais testes no iOS 7 / Safari / etc. para ver se ele realmente resolve o problema.
fonte
Em abril de 2017, um patch foi mesclado no Safari, alinhado com os outros navegadores. Este foi lançado com o Safari 11.
https://bugs.webkit.org/show_bug.cgi?id=157010
fonte
Esta pergunta e resposta me ajudaram a resolver um problema específico com a inscrição de novos usuários no Parse.
Como a função signUp (attrs, options) usa armazenamento local para manter a sessão, se um usuário estiver no modo de navegação privada, ele lança a "QuotaExceededError: DOM Exceção 22: Foi feita uma tentativa de adicionar algo ao armazenamento que excedeu a cota". A exceção e as funções de sucesso / erro nunca são chamadas.
No meu caso, como a função de erro nunca é chamada, inicialmente parecia haver um problema ao disparar o evento click no envio ou no redirecionamento definido no sucesso da inscrição.
A inclusão de um aviso para os usuários resolveu o problema.
Analisar referência do SDK Javascript https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp
fonte