Webapp saya memiliki kesalahan javascript di ios safari private browsing:
JavaScript: kesalahan
tidak terdefinisi
QUOTA_EXCEEDED_ERR: DOM Pengecualian 22: Upaya telah dilakukan untuk menambahkan sesuatu ke penyimpanan ...
kode saya:
localStorage.setItem('test',1)
javascript
html
local-storage
Leiyonglin
sumber
sumber
Jawaban:
Rupanya ini dengan desain. Ketika Safari (OS X atau iOS) dalam mode penjelajahan pribadi, tampaknya seolah-olah
localStorage
tersedia, tetapi mencoba untuk memanggilsetItem
melempar pengecualian.Apa yang terjadi adalah bahwa objek jendela masih terbuka
localStorage
di namespace global, tetapi ketika Anda meneleponsetItem
, pengecualian ini dilemparkan. Panggilan apa pun untukremoveItem
diabaikan.Saya percaya perbaikan yang paling sederhana (meskipun saya belum menguji browser lintas ini) akan mengubah fungsi
isLocalStorageNameSupported()
untuk menguji bahwa Anda juga dapat menetapkan beberapa nilai.https://github.com/marcuswestin/store.js/issues/42
sumber
return localStorageName in win && win[localStorageName];
menjadireturn true
. Maka Anda memiliki fungsi yang mengembalikan benar atau salah dengan aman tergantung pada ketersediaan Penyimpanan lokal. Misalnya:if (isLocalStorageNameSupported()) { /* You can use localStorage.setItem */ } else { /* you can't use localStorage.setItem */ }
Perbaikan yang diposting pada tautan di atas tidak berhasil untuk saya. Ini berhasil:
Berasal dari http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5
sumber
window.sessionStorage
benar. Ini pasti berfungsi dalam kode saya. Harap tunjukkan perbaikan yang sebenarnya Anda ketahui.isLocalStorageNameSupported
dan sedang memeriksawindow.sessionStorage
. Hasil akhirnya sama tapi agak membingungkan. Jawabannya diedit untuk memperjelas.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
Dalam konteks saya, baru saja mengembangkan abstraksi kelas. Ketika aplikasi saya diluncurkan, saya memeriksa apakah localStorage berfungsi dengan memanggil getStorage () . Fungsi ini juga mengembalikan:
Dalam kode saya, saya tidak pernah memanggil localStorage secara langsung. Saya memanggil cusSto global var, saya telah menginisialisasi dengan memanggil getStorage () .
Dengan cara ini, ini berfungsi dengan penelusuran pribadi atau versi Safari tertentu
sumber
Tampaknya Safari 11 mengubah perilaku, dan sekarang penyimpanan lokal berfungsi di jendela browser pribadi. Hore!
Aplikasi web kami yang dulu gagal dalam penjelajahan pribadi Safari sekarang berfungsi dengan sempurna. Itu selalu berfungsi dengan baik dalam mode penjelajahan pribadi Chrome, yang selalu memungkinkan penulisan ke penyimpanan lokal.
Ini didokumentasikan dalam catatan rilis Pratinjau Teknologi Safari Apple - dan catatan rilis WebKit - untuk rilis 29, yang pada bulan Mei 2017.
Secara khusus:
sumber
Untuk memperluas jawaban orang lain, berikut adalah solusi ringkas yang tidak memaparkan / menambah variabel baru. Itu tidak mencakup semua pangkalan, tetapi harus sesuai dengan kebanyakan orang yang hanya ingin aplikasi satu halaman tetap berfungsi (meskipun tidak ada data yang persisten setelah memuat ulang).
sumber
Saya memiliki masalah yang sama menggunakan kerangka kerja ionik (Angular + Cordova). Saya tahu ini tidak menyelesaikan masalah, tetapi ini adalah kode untuk Aplikasi Angular berdasarkan jawaban di atas. Anda akan memiliki solusi singkat untuk penyimpanan lokal pada Safari versi iOS.
Ini kodenya:
Sumber: https://gist.github.com/jorgecasar/61fda6590dc2bb17e871
Nikmati pengkodean Anda!
sumber
Inilah solusi untuk AngularJS menggunakan IIFE dan meningkatkan fakta bahwa layanan adalah lajang .
Hal ini menghasilkan
isLocalStorageAvailable
pengaturan yang segera ketika layanan pertama kali disuntikkan dan menghindari menjalankan cek yang tidak perlu setiap kali penyimpanan lokal perlu diakses.sumber
Saya baru saja membuat repo ini untuk menyediakan
sessionStorage
danlocalStorage
fitur untuk browser yang tidak didukung atau dinonaktifkan.Browser yang didukung
Bagaimana itu bekerja
Ini mendeteksi fitur dengan tipe penyimpanan.
Setel
StorageService.localStorage
kewindow.localStorage
jika didukung atau membuat penyimpanan cookie. SetelStorageService.sessionStorage
kewindow.sessionStorage
jika didukung atau membuat penyimpanan dalam memori untuk SPA, penyimpanan cookie dengan fitur sesion untuk non SPA.sumber
Berikut ini adalah versi layanan Angular2 + untuk alternatif penyimpanan memori, Anda bisa menyuntikkan ke komponen Anda, berdasarkan jawaban Pierre Le Roux.
sumber
Jangan menggunakannya jika tidak didukung dan untuk memeriksa dukungan panggil saja fungsi ini
sumber
Saya telah membuat tambalan untuk masalah ini. Cukup saya memeriksa apakah browser memang mendukung localStorage atau sessionStorage atau tidak. Jika tidak maka mesin penyimpanan akan menjadi Cookie. Tetapi sisi negatifnya adalah Cookie memiliki memori penyimpanan yang sangat kecil :(
sumber
Jawaban yang diterima tampaknya tidak memadai dalam beberapa situasi.
Untuk memeriksa apakah
localStorage
atausessionStorage
didukung, saya menggunakan cuplikan berikut dari MDN .Gunakan cuplikan ini seperti ini, dan mundur ke, misalnya, menggunakan cookie:
Saya telah membuat paket fallbackstorage yang menggunakan snippet ini untuk memeriksa ketersediaan penyimpanan dan fallback ke MemoryStorage yang diimplementasikan secara manual.
sumber
sumber
Skrip berikut memecahkan masalah saya:
Ia memeriksa apakah localStorage ada dan dapat digunakan dan dalam kasus negatif, itu menciptakan penyimpanan lokal palsu dan menggunakannya sebagai pengganti localStorage asli. Tolong beri tahu saya jika Anda membutuhkan informasi lebih lanjut.
sumber