หลังจากดูคำถามนี้ 6 ปีหลังจากถามฉันพบว่ายังไม่มีคำตอบที่เพียงพอสำหรับคำถามนี้ ซึ่งควรทำตามทั้งหมดต่อไปนี้:
- ล้าง Local Storage หลังจากปิดเบราว์เซอร์ (หรือแท็บทั้งหมดของโดเมน)
- เก็บรักษาที่จัดเก็บในตัวเครื่องข้ามแท็บหากมีอย่างน้อยหนึ่งแท็บที่ยังคงใช้งานอยู่
- เก็บรักษาที่จัดเก็บในตัวเครื่องเมื่อรีโหลดแท็บเดียว
ดำเนินการ javascript ส่วนนี้เมื่อเริ่มต้นของแต่ละหน้าโหลดเพื่อให้บรรลุข้างต้น:
((nm,tm) => {
const
l = localStorage,
s = sessionStorage,
tabid = s.getItem(tm) || (newid => s.setItem(tm, newid) || newid)((Math.random() * 1e8).toFixed()),
update = set => {
let cur = JSON.parse(l.getItem(nm) || '{}');
if (set && typeof cur[tabid] == 'undefined' && !Object.values(cur).reduce((a, b) => a + b, 0)) {
l.clear();
cur = {};
}
cur[tabid] = set;
l.setItem(nm, JSON.stringify(cur));
};
update(1);
window.onbeforeunload = () => update(0);
})('tabs','tabid');
แก้ไข:แนวคิดพื้นฐานที่นี่มีดังต่อไปนี้:
- เมื่อเริ่มต้นจากศูนย์หน่วยเก็บข้อมูลเซสชันจะกำหนดรหัสสุ่มในคีย์ที่เรียกว่า
tabid
- หน่วยเก็บภายในเครื่องจะถูกตั้งค่าด้วยคีย์ที่เรียกว่า
tabs
ประกอบด้วยวัตถุเหล่านั้นคีย์tabid
ถูกตั้งค่าเป็น 1
- เมื่อแท็บถูกยกเลิกการโหลดที่จัดเก็บในตัวเครื่อง
tabs
จะถูกอัพเดตเป็นวัตถุที่มีtabid
ชุดเป็น 0
- หากแท็บถูกโหลดซ้ำแท็บนั้นจะถูกยกเลิกการโหลดครั้งแรกและกลับมาทำงานต่อ เนื่องจากคีย์ของที่เก็บข้อมูลเซสชัน
tabid
มีอยู่และtabs
คีย์การจัดเก็บในตัวเครื่องมีคีย์ย่อยของtabid
หน่วยเก็บข้อมูลภายในจะไม่ถูกล้างออก
- เมื่อเบราว์เซอร์ถูกยกเลิกการโหลดที่เก็บเซสชันทั้งหมดจะถูกล้าง เมื่อดำเนินการต่อที่เก็บข้อมูลเซสชัน
tabid
จะไม่อยู่อีกต่อไปและtabid
จะมีการสร้างใหม่ เนื่องจากหน่วยเก็บข้อมูลภายในไม่มีคีย์ย่อยสำหรับสิ่งนี้tabid
หรืออื่น ๆtabid
(ปิดเซสชันทั้งหมด) จึงถูกล้าง
- เมื่อมีแท็บที่สร้างขึ้นใหม่
tabid
จะมีการสร้างขึ้นใหม่ในที่เก็บข้อมูลเซสชัน แต่เนื่องจากมีอย่างน้อยหนึ่งtabs
[ tabid
] อยู่การจัดเก็บในตัวเครื่องจะไม่ถูกล้างออก