Aggiornamento (01/11/2016)
Stavo usando AmplifyJS menzionato di seguito per aggirare questo problema. Tuttavia, per Safari nella navigazione privata, stava ricadendo in una memoria basata sulla memoria. Nel mio caso, non era appropriato perché significa che l'archiviazione viene cancellata durante l'aggiornamento, anche se l'utente è ancora in navigazione privata.
Inoltre, ho notato un numero di utenti che navigano sempre in modalità privata su iOS Safari. Per tale motivo, un migliore fallback per Safari è l'uso dei cookie (se disponibili). Per impostazione predefinita, i cookie sono ancora accessibili anche nella navigazione privata. Naturalmente, vengono cancellati all'uscita dalla navigazione privata, ma non vengono cancellati all'aggiornamento.
Ho trovato la libreria local-storage-fallback . Dalla documentazione:
Scopo
Con le impostazioni del browser come "Navigazione privata" è diventato un problema fare affidamento su un window.localStorage funzionante, anche nei browser più recenti. Anche se può esistere, genererà eccezioni quando si tenta di utilizzare setItem o getItem. Questo modulo eseguirà i controlli appropriati per vedere quale meccanismo di archiviazione del browser potrebbe essere disponibile e quindi esporlo. Utilizza la stessa API di localStorage, quindi nella maggior parte dei casi dovrebbe funzionare come sostituzione drop-in.
Attenzione ai gotcha:
- CookieStorage ha limiti di archiviazione. Stai attento qui.
- MemoryStorage non persisterà tra i caricamenti di pagina. Questo è più o meno uno stop-gap per prevenire arresti anomali della pagina, ma può essere sufficiente per i siti Web che non eseguono il caricamento completo della pagina.
TL; DR:
Usa local-storage-fallback (API unificata con .getItem(prop)
e .setItem(prop, val)
):
Controllare e utilizzare l'adattatore di archiviazione appropriato per il browser (localStorage, sessionStorage, cookies, memory)
Risposta originale
Per aggiungere risposte precedenti, una possibile soluzione alternativa sarebbe quella di modificare il metodo di archiviazione. Ci sono alcune librerie come AmplifyJS e PersistJS che possono aiutare. Entrambe le librerie consentono l'archiviazione persistente sul lato client attraverso diversi backend.
Per AmplifyJS
memoria locale
- IE 8+
- Firefox 3.5+
- Safari 4+
- Cromo
- Opera 10.5+
- iPhone 2+
- Android 2+
sessionStorage
- IE 8+
- Firefox 2+
- Safari 4+
- Cromo
- Opera 10.5+
- iPhone 2+
- Android 2+
globalStorage
dati utente
- IE 5 - 7
- userData esiste anche nelle versioni più recenti di IE, ma a causa di stranezze nell'implementazione di IE 9, non registriamo userData se localStorage è supportato.
memoria
- Un archivio in memoria viene fornito come fallback se nessuno degli altri tipi di archiviazione è disponibile.
Per PersistentJS
- flash: memoria permanente Flash 8.
- gears: archiviazione persistente basata su Google Gears.
- localstorage: archiviazione bozze HTML5.
- globalstorage: archiviazione bozze HTML5 (vecchie specifiche).
- ovvero: comportamenti dei dati utente di Internet Explorer.
- cookie: archiviazione persistente basata su cookie.
Offrono un livello di astrazione in modo da non doverti preoccupare di scegliere il tipo di archiviazione. Tieni presente che potrebbero esserci alcune limitazioni (come i limiti di dimensione) a seconda del tipo di archiviazione. In questo momento, sto usando AmplifyJS, ma devo ancora fare altri test su iOS 7 / Safari / ecc. per vedere se risolve effettivamente il problema.