อัปเดต (2016-11-01)
ฉันใช้ AmplifyJS ที่กล่าวถึงด้านล่างเพื่อแก้ไขปัญหานี้ อย่างไรก็ตามสำหรับ Safari ในการเรียกดูแบบส่วนตัวมันก็กลับไปที่หน่วยความจำที่ใช้หน่วยความจำ ในกรณีของฉันมันไม่เหมาะสมเพราะมันหมายถึงที่เก็บข้อมูลถูกล้างเมื่อรีเฟรชแม้ว่าผู้ใช้จะยังคงอยู่ในการเรียกดูแบบส่วนตัว
นอกจากนี้ฉันยังสังเกตเห็นผู้ใช้จำนวนมากที่มักเรียกดูในโหมดส่วนตัวบน iOS Safari ด้วยเหตุผลดังกล่าวทางเลือกที่ดีกว่าสำหรับ Safari คือการใช้คุกกี้ (หากมี) ตามค่าเริ่มต้นคุกกี้ยังคงสามารถเข้าถึงได้แม้ในการเบราส์ส่วนตัว แน่นอนว่าพวกเขาจะถูกล้างเมื่อออกจากการเรียกดูแบบส่วนตัว แต่จะไม่ถูกล้างเมื่อรีเฟรช
ฉันพบไลบรารีlocal-storage-fallback จากเอกสาร:
วัตถุประสงค์
ด้วยการตั้งค่าเบราว์เซอร์เช่น "การดูเว็บแบบส่วนตัว" มันกลายเป็นปัญหาที่ต้องพึ่งพาหน้าต่างที่ใช้งานได้การจัดเก็บข้อมูลแม้กระทั่งในเบราว์เซอร์ใหม่ แม้ว่ามันอาจมีอยู่ แต่มันจะโยนข้อยกเว้นเมื่อพยายามใช้ setItem หรือ getItem โมดูลนี้จะเรียกใช้การตรวจสอบที่เหมาะสมเพื่อดูว่ากลไกการจัดเก็บข้อมูลของเบราว์เซอร์ใดที่อาจพร้อมใช้งานจากนั้นจึงเปิดเผย มันใช้ API เดียวกับ localStorage ดังนั้นจึงควรใช้แทนการดรอปอินในกรณีส่วนใหญ่
ระวังของ gotchas:
- CookieStorage มีพื้นที่ จำกัด ระวังที่นี่
- MemoryStorage จะไม่คงอยู่ระหว่างการโหลดหน้า นี่เป็นช่องว่างหยุดมากขึ้นหรือน้อยลงเพื่อป้องกันการล่มของหน้า แต่อาจเพียงพอสำหรับเว็บไซต์ที่ไม่โหลดเต็มหน้า
TL; DR:
ใช้local-storage-fallback (unified API ด้วย.getItem(prop)
และ.setItem(prop, val)
):
ตรวจสอบและใช้อะแดปเตอร์หน่วยเก็บข้อมูลที่เหมาะสมสำหรับเบราว์เซอร์ (localStorage, sessionStorage, คุกกี้, หน่วยความจำ)
คำตอบเดิม
เพื่อเพิ่มตามคำตอบก่อนหน้าหนึ่งวิธีแก้ปัญหาที่เป็นไปได้หนึ่งคือการเปลี่ยนวิธีการจัดเก็บ มีการสักสองสามอย่างเช่นAmplifyJSและPersistJSที่สามารถช่วยได้ libs ทั้งสองอนุญาตการจัดเก็บข้อมูลฝั่งไคลเอ็นต์แบบถาวรผ่านแบ็กเอนด์หลาย ๆ
สำหรับ AmplifyJS
localStorage
- IE 8+
- Firefox 3.5+
- Safari 4+
- โครเมียม
- Opera 10.5+
- iPhone 2+
- Android 2+
sessionStorage
- IE 8+
- Firefox 2+
- Safari 4+
- โครเมียม
- Opera 10.5+
- iPhone 2+
- Android 2+
globalStorage
UserData
- IE 5 - 7
- userData มีอยู่ใน IE เวอร์ชั่นใหม่กว่าเช่นกัน แต่เนื่องจากพฤติกรรมในการใช้งาน IE 9 เราจึงไม่ลงทะเบียน userData หากรองรับ localStorage
หน่วยความจำ
- ที่เก็บในหน่วยความจำมีให้เป็นทางเลือกหากไม่มีประเภทการจัดเก็บอื่น ๆ
สำหรับ PersistentJS
- แฟลช: แฟลช 8 ที่เก็บข้อมูลถาวร
- gears: ที่เก็บข้อมูลถาวรบน Google Gears
- localstorage: ที่เก็บแบบร่าง HTML5
- globalstorage: ที่เก็บแบบร่าง HTML5 (ข้อมูลจำเพาะเก่า)
- เช่นพฤติกรรมผู้ใช้ Internet Explorer
- คุกกี้: ที่เก็บข้อมูลถาวรแบบอิงคุกกี้
พวกมันมีเลเยอร์ที่เป็นนามธรรมดังนั้นคุณไม่ต้องกังวลกับการเลือกประเภทของที่เก็บข้อมูล โปรดทราบว่าอาจมีข้อ จำกัด บางอย่าง (เช่น จำกัด ขนาด) ขึ้นอยู่กับประเภทของที่เก็บข้อมูล ตอนนี้ฉันกำลังใช้ AmplifyJS แต่ฉันยังต้องทำการทดสอบเพิ่มเติมใน iOS 7 / Safari / ฯลฯ เพื่อดูว่าจริงแก้ปัญหา