Menggunakan LocalStorage di iPhone dengan iOS 7 melempar kesalahan ini. Saya sudah mencari-cari resolusi, tapi mengingat saya bahkan tidak browsing secara pribadi, tidak ada yang relevan.
Saya tidak mengerti mengapa localStorage akan dinonaktifkan secara default di iOS 7, tetapi sepertinya begitu? Saya telah menguji di situs web lain juga, tetapi tidak berhasil. Saya bahkan mencoba mengujinya menggunakan situs web ini: http://arty.name/localstorage.html , tetapi sepertinya tidak menyimpan apa-apa karena alasan yang aneh.
Adakah yang punya masalah yang sama, hanya saja mereka sudah beruntung memperbaikinya? Haruskah saya beralih metode penyimpanan saya?
Saya mencoba keras debugging dengan hanya menyimpan beberapa baris informasi, tetapi tidak berhasil. Saya menggunakan localStorage.setItem()
fungsi standar untuk menyimpan.
Jawaban:
Ini dapat terjadi saat Safari berada dalam mode penelusuran pribadi. Saat dalam penelusuran pribadi, penyimpanan lokal tidak tersedia sama sekali.
Salah satu solusinya adalah untuk memperingatkan pengguna bahwa aplikasi membutuhkan mode non-pribadi untuk bekerja.
UPDATE: Ini telah diperbaiki di Safari 11 , sehingga perilaku sekarang diselaraskan dengan browser lain.
sumber
if( typeof Storage != 'undefined' ) { ... }
) sebelum mencoba memuat dan menyimpan informasi tetapi mendapatkan kesalahan ini. TernyataStorage
masih ditentukan bahkan ketika itu tidak dapat digunakan. Menggunakan try / catch mulai sekarang setiap kali saya menggunakan LocalStorage.Seperti disebutkan dalam jawaban lain, Anda akan selalu mendapatkan QuotaExceededError di Safari Private Browser Mode di iOS dan OS X saat
localStorage.setItem
(atausessionStorage.setItem
) dipanggil.Salah satu solusinya adalah melakukan pemeriksaan coba / tangkap atau Modernizr di setiap contoh penggunaan
setItem
.Namun, jika Anda ingin shim yang secara global menghentikan kesalahan ini, untuk mencegah sisa JavaScript Anda rusak, Anda dapat menggunakan ini:
https://gist.github.com/philfreo/68ea3cd980d72383c951
sumber
Saya menggunakan fungsi sederhana ini, yang mengembalikan
true
ataufalse
, untuk menguji ketersediaan localStorage:Sekarang Anda dapat menguji
localStorage.setItem()
ketersediaan sebelum menggunakannya. Contoh:sumber
window.sessionStorage
digunakan alih-alihwindow.localStorage
untuk metode yang disebutisLocalStorageNameSupported
?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
membuatnya lebih mudah untuk mengatur breakpoints jika Anda ingin menguji pengembangan Anda. Tidak ada argumen yang benar yang "lebih baik" dan itu benar-benar hanya preferensi pribadi di sini yang keliru di sisi hati-hati. Hal utama untuk diperhatikan adalah bahwa keduasessionStorage
danlocalStorage
keduanya implementasi dari HTML5 WebStorage API.Saya kebetulan menjalankan dengan masalah yang sama di iOS 7 (dengan beberapa perangkat tanpa simulator).
Sepertinya Safari di iOS 7 memiliki kuota penyimpanan yang lebih rendah, yang tampaknya dicapai dengan memiliki log riwayat yang panjang.
Saya kira praktik terbaik adalah menangkap pengecualian.
Proyek Modernizr memiliki tambalan mudah, Anda harus mencoba sesuatu yang serupa: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
sumber
Berikut adalah solusi yang diperluas berdasarkan jawaban DrewT di atas yang menggunakan cookie jika penyimpanan lokal tidak tersedia. Ini menggunakan perpustakaan docCookies Mozilla :
Di sumber Anda, cukup gunakan:
sumber
Seperti yang sudah dijelaskan dalam jawaban lain, ketika dalam mode Penjelajahan Pribadi, Safari akan selalu membuang pengecualian ini ketika mencoba menyimpan data
localStorage.setItem()
.Untuk memperbaikinya saya menulis localStorage palsu yang meniru localStorage, baik metode maupun peristiwa.
LocalStorage palsu: https://gist.github.com/engelfrost/fd707819658f72b42f55
Ini mungkin bukan solusi umum yang baik untuk masalah ini. Ini adalah solusi yang baik untuk skenario saya, di mana alternatifnya akan menjadi menulis ulang besar untuk aplikasi yang sudah ada.
sumber
Pembaruan (2016-11-01)
Saya menggunakan AmplifyJS yang disebutkan di bawah untuk mengatasi masalah ini. Namun, untuk Safari dalam penjelajahan Pribadi, itu kembali ke penyimpanan berbasis memori. Dalam kasus saya, itu tidak sesuai karena itu berarti penyimpanan dihapus saat refresh, bahkan jika pengguna masih dalam penelusuran pribadi.
Juga, saya perhatikan sejumlah pengguna yang selalu menjelajah dalam mode Privat di iOS Safari. Karena alasan itu, fallback yang lebih baik untuk Safari adalah menggunakan cookie (jika tersedia). Secara default, cookie masih dapat diakses bahkan di penelusuran pribadi. Tentu saja, mereka dihapus ketika keluar dari penjelajahan pribadi, tetapi mereka tidak dihapus saat refresh.
Saya menemukan perpustakaan penyimpanan-fallback lokal . Dari dokumentasi:
Waspadalah terhadap gotcha:
TL; DR:
Gunakan local-storage-fallback (API terpadu dengan
.getItem(prop)
dan.setItem(prop, val)
):Jawaban asli
Untuk menambahkan jawaban sebelumnya, satu solusi yang mungkin dilakukan adalah mengubah metode penyimpanan. Ada beberapa librairie seperti AmplifyJS dan PersistJS yang dapat membantu. Kedua lib memungkinkan penyimpanan sisi klien yang persisten melalui beberapa backend.
Untuk AmplifyJS
Untuk PersistentJS
Mereka menawarkan lapisan abstraksi sehingga Anda tidak perlu khawatir memilih jenis penyimpanan. Perlu diingat mungkin ada beberapa batasan (seperti batas ukuran) tergantung pada tipe penyimpanannya. Saat ini, saya menggunakan AmplifyJS, tetapi saya masih harus melakukan beberapa pengujian lagi pada iOS 7 / Safari / dll. untuk melihat apakah itu benar-benar menyelesaikan masalah.
sumber
Pada April 2017 tambalan digabungkan ke Safari, sehingga diselaraskan dengan peramban lain. Ini dirilis dengan Safari 11.
https://bugs.webkit.org/show_bug.cgi?id=157010
sumber
Pertanyaan dan jawaban ini membantu saya memecahkan masalah tertentu dengan mendaftar pengguna baru di Parse.
Karena fungsi signUp (attrs, options) menggunakan penyimpanan lokal untuk melanjutkan sesi, jika pengguna berada dalam mode penjelajahan pribadi ia melempar "QuotaExceededError: DOM Pengecualian 22: Upaya dilakukan untuk menambahkan sesuatu ke penyimpanan yang melebihi kuota." fungsi pengecualian dan keberhasilan / kesalahan tidak pernah dipanggil.
Dalam kasus saya, karena fungsi kesalahan yang tidak pernah dipanggil, awalnya tampak sebagai masalah dengan menjalankan peristiwa klik pada ajukan atau pengalihan yang ditentukan pada keberhasilan mendaftar.
Termasuk peringatan untuk pengguna menyelesaikan masalah.
Parse Javascript Referensi SDK https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp
sumber