วิธีการลบรายการ localStorage เมื่อปิดหน้าต่างแท็บ / เบราว์เซอร์


403

เคสของฉัน: localStorage พร้อมคีย์ + ค่าที่ควรลบเมื่อปิดเบราว์เซอร์ไม่ใช่แท็บเดียว

โปรดดูรหัสของฉันถ้ามันเหมาะสมและสิ่งที่สามารถปรับปรุงได้:

//create localStorage key + value if not exist
if(localStorage){
   localStorage.myPageDataArr={"name"=>"Dan","lastname"=>"Bonny"}; 
}

//when browser closed - psedocode
$(window).unload(function(){
  localStorage.myPageDataArr=undefined;
});

32
หากคุณต้องการล้างที่เก็บข้อมูลในเบราว์เซอร์ใกล้ฉันจะถามเหตุผลของคุณในการใช้
Dunhamzzz

16
คุณสามารถมีทั้งที่เก็บข้อมูลในเครื่องและในที่เก็บวัตถุฉันจะใช้ sessionStorage สำหรับค่าเซสชัน Btw การตั้งค่าเป็น undefined จะไม่ลบหรือลบออกจาก localStorage เพียงตั้งค่าเป็น undefined
kennebec

2
@kennebec - การตั้งค่าให้undefinedเขียนทับรายการที่เก็บไว้ก่อนหน้านี้ แต่ใช่การใช้.removeItem()มีความเหมาะสมมากกว่า
nnnnnn

2
เพียงใช้ sessionStorage แทน localStorage
Alberto Acuña

2
ใช้localStorage.clear(); หากคุณต้องการล้างพื้นที่เก็บข้อมูลทั้งหมด
Black Mamba

คำตอบ:


802

ควรทำเช่นนั้นและไม่ใช่กับตัวดำเนินการลบ:

localStorage.removeItem(key);

1
ทำไมเราไม่สามารถใช้โอเปอเรเตอร์การลบได้ จากการทดสอบของฉันดูเหมือนว่าใช้delete localStorage.keyงานได้ดีเหมือนlocalStorage.removeItem(key)กัน ดูเหมือนชัดเจนกับผมที่จะใช้ลบเมื่อฉันตั้งค่าตัวแปรของฉันเหมือนมากกว่าlocalStorage.key = 1 localStorage.setItem('key', 1)
Aust

6
หากใช้งานได้คุณสามารถใช้งานได้ในทางเทคนิค แต่การพิจารณา removeItem มีให้ในฐานะสมาชิกฟังก์ชันดูเหมือนว่ามีเหตุผลที่จะใช้มันแทนที่จะใช้เป็นพฤติกรรมที่อาจไม่ได้กำหนดโดยใช้โอเปอเรเตอร์แยกต่างหาก
kungphu

@kungphu โปรดจำไว้ว่าหนึ่งสามารถทำ (โดยไม่ได้ตั้งใจ) localStorage.removeItem = null;ทำให้localStorage.removeItem(key);ความคิดที่น่าสงสาร
skeggse

31
ฉันไม่เห็นว่ามันเป็นแผนฉุกเฉินที่สมเหตุสมผล ความจริงที่ว่าภาษาทำให้ผู้คนสามารถทำสิ่งที่ทำลายล้างไม่ได้หมายความว่าคุณควรใช้วิธีที่ไม่ได้มาตรฐานในการใช้ห้องสมุดเพื่อป้องกันการใช้ภาษาในทางที่ผิด หากคุณหรือเพื่อนนักพัฒนาของคุณไม่เข้าใจความแตกต่างระหว่างการเรียกใช้และการมอบหมายคุณมีปัญหาใหญ่กว่าการลบรายการออกจาก LocalStorage
kungphu

3
@skeggse นี่คือเหตุผลที่มันเป็นความคิดที่ดีที่จะเขียนlocalStorage.key = 1ในสถานที่แรก - เพื่อหลีกเลี่ยงการเกิดอุบัติเหตุเช่นนี้
Jivan

114

ใช้กับwindowคำหลักทั่วโลก: -

 window.localStorage.removeItem('keyName');

6
ทำไมต้องใช้หน้าต่างวัตถุ ก็localStorage.removeItem(key)ทำงานได้ดี
Pardeep Jain

3
ลองดูที่ลิงค์นี้stackoverflow.com/questions/5319878/…
เถาวัลย์

โซลูชันนี้ใช้งานได้จริงกับ IE 11 หรือไม่ กรุณาแนะนำ ฉันมีปัญหานี้ในรหัสเชิงมุม 5
Karan

95

คุณสามารถใช้ประโยชน์จาก beforeunloadเหตุการณ์ใน JavaScript

ใช้ vanilla JavaScript คุณสามารถทำสิ่งที่ชอบ:

window.onbeforeunload = function() {
  localStorage.removeItem(key);
  return '';
};

สิ่งนี้จะลบคีย์ก่อนที่หน้าต่าง / แท็บของเบราว์เซอร์จะปิดและแจ้งให้คุณยืนยันการปิดหน้าต่าง / แท็บ ฉันหวังว่าจะแก้ปัญหาของคุณ

หมายเหตุ: onbeforeunloadวิธีการควรส่งคืนสตริง


มันมีประโยชน์จริง ๆ มันอาจจะดีที่จะยอมรับคำตอบ (แม้หลังจากทั้งหมดนี้)
Richard Morgan

8
@dhsto VanillaJS เป็น JavaScript ธรรมดา :) ดูที่นี่: VanillaJS คืออะไร? .
Bharat Khatri

1
ปัญหาหนึ่งคือสิ่งนี้ถูกเรียกใช้แม้ว่าคุณจะไปยังหน้าเดียวกันไม่ใช่เฉพาะตอนที่ปิดแท็บซึ่งอาจไม่ใช่สิ่งที่ตั้งใจไว้ หมายเหตุด้านข้าง: การคืนค่าที่ไม่ได้กำหนดจาก onbeforeunload จะปิดใช้งานข้อความที่แสดงเมื่อยกเลิกการโหลด
Stan Bondi

จะเกิดอะไรขึ้นถ้าผู้ใช้ต้องการอยู่ในหน้าและคุณได้ลบที่เก็บข้อมูลในเครื่องอยู่แล้ว? วิธีการแก้ปัญหาไม่ได้ทำงานกับ Chrome และ IE11
oracleruiz

ทำไมไม่ใช้ sessionStorage
Sachin Prasad

94

คุณควรใช้ sessionStorage แทนหากคุณต้องการลบคีย์เมื่อปิดเบราว์เซอร์


3
นี่คือคำตอบที่ดีที่สุด; sessionStorageเป็นการเยียวยาสำหรับสิ่งที่ผู้ถามอธิบาย
Benny

8
+1 สำหรับการกล่าวถึงsessionStorageแต่W3C Editor's Draftพูดว่า: 'อายุการใช้งานของบริบทการสืบค้นอาจไม่เกี่ยวข้องกับอายุการใช้งานของกระบวนการตัวแทนผู้ใช้จริงด้วยตนเองเนื่องจากตัวแทนผู้ใช้อาจสนับสนุนการดำเนินการเซสชันต่อหลังจากรีสตาร์ท'
Tamás

28
ปัญหาของ 'sessionStorage' คือมันไม่ได้ถูกเก็บไว้เมื่อคุณเปิดแท็บใหม่ตัวอย่างเช่น ctrl คลิกที่ลิงค์ ฉันต้องการ localStorage / sessionStorage hybrid lol
Edwin Stoteler

3
@EdwinStoteler ฉันด้วย ฉันสับสนในสิ่งที่พวกเขาคิดเมื่อพวกเขาออกแบบมันด้วยวิธีนี้ ฉันต้องการเข้าถึงหน่วยความจำในเบราว์เซอร์เท่านั้นที่ถูกทำลายเมื่อเบราว์เซอร์ปิด ฉันต้องการจัดเก็บข้อมูลที่ละเอียดอ่อนในวิธีที่สามารถเข้าถึงได้ทั่วทั้งโดเมน แต่ฉันไม่ต้องการให้ข้อมูลนั้นกระทบกับฮาร์ดดิสก์ใด ๆ
BT

19

ลองใช้ดู

$(window).unload(function(){
  localStorage.clear();
});

หวังว่านี่จะเป็นประโยชน์สำหรับคุณ


2
คุณต้องการล้าง localStorage ที่สมบูรณ์หรือไม่? ถ้าเป็นเช่นนั้นให้ใช้localStorage.clear();
Rafael Marques

มันชัดเจนว่าสิ่งที่ฉันต้องการในคำถาม - ที่สำคัญเพียงลบค่า +
Yosef

12
สิ่งนี้จะทำความสะอาดพื้นที่จัดเก็บทั้งหมด ทางออกที่ไม่ดี!
Emmy

12

มีกรณีการใช้งานที่เฉพาะเจาะจงมากซึ่งข้อเสนอแนะใด ๆ ที่จะใช้ sessionStorage แทน localStorage ไม่ได้ช่วยอะไรจริงๆ กรณีการใช้งานจะเป็นสิ่งที่เรียบง่ายเหมือนกับที่มีบางอย่างถูกเก็บไว้ในขณะที่คุณเปิดแท็บอย่างน้อยหนึ่งแท็บ แต่จะทำให้การใช้งานนั้นไม่ถูกต้องหากคุณปิดแท็บสุดท้ายที่เหลืออยู่ หากคุณต้องการให้บันทึกค่าข้ามแท็บและหน้าต่าง sessionStorage ไม่ได้ช่วยคุณเว้นแต่คุณจะทำให้ชีวิตของคุณวุ่นวายกับผู้ฟังอย่างที่ฉันเคยลอง ในระหว่างนี้ localStorage จะสมบูรณ์แบบสำหรับสิ่งนี้ แต่มันทำงานได้ดีเกินไปเนื่องจากข้อมูลของคุณจะรออยู่ที่นั่นแม้หลังจากรีสตาร์ทเบราว์เซอร์ ฉันใช้รหัสที่กำหนดเองและตรรกะที่ใช้ประโยชน์จากทั้งสองอย่าง

ฉันควรอธิบายแล้วให้รหัส ก่อนอื่นให้เก็บสิ่งที่คุณต้องการใน localStorage จากนั้นใน localStorage จะสร้างตัวนับที่จะมีจำนวนแท็บที่คุณเปิด สิ่งนี้จะเพิ่มขึ้นทุกครั้งที่หน้าเว็บโหลดและลดลงทุกครั้งที่หน้าเว็บไม่โหลด คุณสามารถเลือกกิจกรรมที่จะใช้ที่นี่ฉันขอแนะนำ 'โหลด' และ 'ยกเลิกการโหลด' ในเวลาที่คุณยกเลิกการโหลดคุณต้องทำงานล้างข้อมูลที่คุณต้องการเมื่อตัวนับถึง 0 ซึ่งหมายความว่าคุณกำลังปิดแท็บสุดท้าย นี่คือส่วนที่ยุ่งยาก: ฉันไม่ได้พบวิธีที่เชื่อถือได้และทั่วไปในการบอกความแตกต่างระหว่างการโหลดหน้าใหม่หรือการนำทางภายในหน้าและการปิดแท็บ ดังนั้นหากข้อมูลที่คุณจัดเก็บไม่ใช่สิ่งที่คุณสามารถสร้างขึ้นมาใหม่เมื่อโหลดหลังจากตรวจสอบว่านี่เป็นแท็บแรกของคุณ จากนั้นคุณไม่สามารถลบออกได้ทุกครั้งที่รีเฟรช แต่คุณต้องเก็บค่าสถานะไว้ใน sessionStorage ทุกครั้งที่โหลดก่อนที่จะเพิ่มตัวนับแท็บ ก่อนที่จะเก็บค่านี้คุณสามารถทำการตรวจสอบเพื่อดูว่ามันมีค่าอยู่แล้วหรือไม่และถ้าไม่นั่นหมายความว่าคุณกำลังโหลดเข้าสู่เซสชันนี้เป็นครั้งแรกหมายความว่าคุณสามารถทำการล้างข้อมูลที่โหลดได้ ไม่ได้ตั้งค่าและตัวนับเป็น 0


เป็นคำตอบของ "ทำไมไม่ใช้ sessionStorage?" วิธีการก็มาจากw3schools.com/html/html5_webstorage.asp : "window.sessionStorage - เก็บข้อมูลสำหรับหนึ่งเซสชัน (ข้อมูลจะหายไปเมื่อแท็บถูกปิด)" ดังนั้นคำตอบก็คือ sessionStorage ไร้ประโยชน์หากคุณต้องการบางสิ่งบางอย่างถาวรแม้ใน usecase ฉันอธิบาย
Solthun

3
ฉันคิดว่าการใช้งานที่ดีที่สุดสำหรับบริการนี้คือบริการ browserWatcher ซึ่งโดยทั่วไปแล้วจะเป็นเหตุการณ์ที่ส่วนประกอบอื่น ๆ สามารถฟังได้ (เช่นเปิดเบราว์เซอร์ปิดเบราว์เซอร์โหลด broswer โหลดเบราว์เซอร์ ฯลฯ และซ่อนรายละเอียดการใช้งานเหล่านี้ แต่ละองค์ประกอบสามารถตัดสินใจได้ว่าเหตุการณ์ใดที่จะต้องจัดการเพื่อให้สามารถทำงานได้คำถามเดียวของฉันคือสิ่งที่เกิดขึ้นหากไฟฟ้าถูกตัดไปที่เครื่องหรือบางสิ่งบางอย่างดังนั้นคุณสมบัติเหล่านี้จะอยู่ใน localStorage ในครั้งต่อไป ?
pQuestions123

11

ใช้ sessionStorage

วัตถุ sessionStorage เท่ากับวัตถุ localStorage ยกเว้นว่ามันจะเก็บข้อมูลสำหรับเซสชั่นเดียวเท่านั้น ข้อมูลจะถูกลบเมื่อผู้ใช้ปิดหน้าต่างเบราว์เซอร์

ตัวอย่างต่อไปนี้นับจำนวนครั้งที่ผู้ใช้คลิกปุ่มในเซสชันปัจจุบัน:

ตัวอย่าง

if (sessionStorage.clickcount) {
    sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1;
} else {
    sessionStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "You have clicked the button " +
sessionStorage.clickcount + " time(s) in this session.";

1
ข้อมูลจะถูกลบในแท็บเบราว์เซอร์ปิด
Kosmonaft

7
for (let i = 0; i < localStorage.length; i++) {
    if (localStorage.key(i).indexOf('the-name-to-delete') > -1) {
        arr.push(localStorage.key(i));
    }
}

for (let i = 0; i < arr.length; i++) {
    localStorage.removeItem(arr[i]);
}

5
localStorage.removeItem(key);  //item

localStorage.clear(); //all items

1
เมื่อตอบคำถามเก่าคำตอบของคุณจะมีประโยชน์มากกว่าสำหรับผู้ใช้ StackOverflow รายอื่นหากคุณรวมบริบทบางอย่างเพื่ออธิบายว่าคำตอบของคุณช่วยได้อย่างไรโดยเฉพาะอย่างยิ่งสำหรับคำถามที่มีคำตอบที่ยอมรับแล้ว ดู: ฉันจะเขียนคำตอบที่ดีได้อย่างไร
Tân

ดูชัดเจนสำหรับฉัน
Giorgio Tempesta

4

แม้ว่าผู้ใช้บางคนตอบคำถามนี้ไปแล้ว แต่ฉันขอยกตัวอย่างการตั้งค่าแอปพลิเคชันเพื่อแก้ไขปัญหานี้

ฉันมีปัญหาเดียวกัน ฉันใช้https://github.com/grevory/angular-local-storageโมดูลในแอปพลิเคชันของ angularjs ของฉัน หากคุณกำหนดค่าแอปของคุณดังต่อไปนี้แอปจะบันทึกตัวแปรในที่เก็บข้อมูลเซสชันแทนที่จัดเก็บในตัวเครื่อง ดังนั้นหากคุณปิดเบราว์เซอร์หรือปิดแท็บที่เก็บข้อมูลเซสชันจะถูกลบโดยอัตโนมัติ คุณไม่จำเป็นต้องทำอะไร

app.config(function (localStorageServiceProvider) {
  localStorageServiceProvider
  .setPrefix('myApp')
  .setStorageType('sessionStorage')
});

หวังว่ามันจะช่วย


4

มีห้าวิธีให้เลือก:

  • setItem (): เพิ่มคีย์และค่าให้กับ localStorage
  • getItem (): ดึงค่าโดยคีย์จาก localStorage
  • removeItem (): ลบรายการโดยคีย์จาก localStorage
  • clear (): ล้าง localStorage ทั้งหมด
  • key (): ส่งผ่านตัวเลขเพื่อดึงคีย์ nth ของ localStorage

คุณสามารถใช้ clear () วิธีนี้เมื่อเรียกใช้จะล้างข้อมูลทั้งหมดของระเบียนทั้งหมดสำหรับโดเมนนั้น ไม่ได้รับพารามิเตอร์ใด ๆ

window.localStorage.clear();

3

นี่คือการทดสอบง่ายๆเพื่อดูว่าคุณมีการสนับสนุนเบราว์เซอร์เมื่อทำงานกับที่เก็บข้อมูลในเครื่องหรือไม่:

if(typeof(Storage)!=="undefined") {
  console.log("localStorage and sessionStorage support!");
  console.log("About to save:");
  console.log(localStorage);
  localStorage["somekey"] = 'hello';
  console.log("Key saved:");
  console.log(localStorage);
  localStorage.removeItem("somekey");  //<--- key deleted here
  console.log("key deleted:");
  console.log(localStorage);
  console.log("DONE ===");
} else {
  console.log("Sorry! No web storage support..");
}

ใช้งานได้ตามที่คาดหวัง (ฉันใช้ Google Chrome) ที่ดัดแปลงมาจาก: http://www.w3schools.com/html/html5_webstorage.asp


3

ฉันไม่คิดว่าวิธีแก้ปัญหาที่นำเสนอที่นี่ถูกต้อง 100% เพราะเหตุการณ์ window.onbeforeunload ถูกเรียกว่าไม่เฉพาะเมื่อปิดเบราว์เซอร์ / แท็บ (ซึ่งจำเป็นต้องมี) แต่ยังรวมถึงเหตุการณ์อื่น ๆ อีกมากมาย (ซึ่งอาจไม่จำเป็นต้องใช้)

ดูลิงค์นี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรายการของเหตุการณ์ที่สามารถยิง window.onbeforeunload: -

http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx


คุณอาจพูดถูก แต่สิ่งที่คุณโพสต์ไว้เป็นความคิดเห็นไม่ใช่คำตอบ
nnnnnn

3

ทำไมไม่ใช้ sessionStorage

"วัตถุ sessionStorage เท่ากับวัตถุ localStorage ยกเว้นว่าจะเก็บข้อมูลไว้เพียงหนึ่งเซสชันเท่านั้นข้อมูลจะถูกลบเมื่อผู้ใช้ปิดหน้าต่างเบราว์เซอร์"

http://www.w3schools.com/html/html5_webstorage.asp


3

หลังจากดูคำถามนี้ 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');

แก้ไข:แนวคิดพื้นฐานที่นี่มีดังต่อไปนี้:

  1. เมื่อเริ่มต้นจากศูนย์หน่วยเก็บข้อมูลเซสชันจะกำหนดรหัสสุ่มในคีย์ที่เรียกว่า tabid
  2. หน่วยเก็บภายในเครื่องจะถูกตั้งค่าด้วยคีย์ที่เรียกว่าtabsประกอบด้วยวัตถุเหล่านั้นคีย์tabidถูกตั้งค่าเป็น 1
  3. เมื่อแท็บถูกยกเลิกการโหลดที่จัดเก็บในตัวเครื่องtabsจะถูกอัพเดตเป็นวัตถุที่มีtabidชุดเป็น 0
  4. หากแท็บถูกโหลดซ้ำแท็บนั้นจะถูกยกเลิกการโหลดครั้งแรกและกลับมาทำงานต่อ เนื่องจากคีย์ของที่เก็บข้อมูลเซสชันtabidมีอยู่และtabsคีย์การจัดเก็บในตัวเครื่องมีคีย์ย่อยของtabidหน่วยเก็บข้อมูลภายในจะไม่ถูกล้างออก
  5. เมื่อเบราว์เซอร์ถูกยกเลิกการโหลดที่เก็บเซสชันทั้งหมดจะถูกล้าง เมื่อดำเนินการต่อที่เก็บข้อมูลเซสชันtabidจะไม่อยู่อีกต่อไปและtabidจะมีการสร้างใหม่ เนื่องจากหน่วยเก็บข้อมูลภายในไม่มีคีย์ย่อยสำหรับสิ่งนี้tabidหรืออื่น ๆtabid (ปิดเซสชันทั้งหมด) จึงถูกล้าง
  6. เมื่อมีแท็บที่สร้างขึ้นใหม่tabidจะมีการสร้างขึ้นใหม่ในที่เก็บข้อมูลเซสชัน แต่เนื่องจากมีอย่างน้อยหนึ่งtabs[ tabid] อยู่การจัดเก็บในตัวเครื่องจะไม่ถูกล้างออก

1
หากเบราว์เซอร์ขัดข้องwindow.onbeforeunloadจะไม่มีการเรียกใช้และtabs[tabid]จะไม่ตั้งค่าโลคัลเป็น 0 => ที่จัดเก็บในตัวเครื่องจะไม่ถูกล้างอีกต่อไป ฉันคิดว่าสุนัขเฝ้าบ้านจะเหมาะสมกว่าในกรณีนั้นแทนที่จะเขียน 1 เมื่อโหลดแท็บคุณควรเขียนการประทับเวลาปัจจุบัน จากนั้นในส่วนลดคุณควรยืนยันความล่าช้าเนื่องจากการประทับเวลานั้นไม่ใหญ่เกินไปหรือแทนที่ด้วย 0 หากเป็น onbeforeunloadวิธีการที่คุณไม่ได้ขึ้นอยู่กับการเรียกร้องที่แท้จริงของ แท็บเพียงแค่ต้องรีเซ็ตสุนัขเฝ้าบ้านเป็นครั้งคราวเพื่อรักษาการดำรงอยู่ของการจัดเก็บในท้องถิ่น
xryl669

1

นี่เป็นคำถามเก่า แต่ดูเหมือนว่าไม่มีคำตอบใดที่สมบูรณ์แบบ

ในกรณีที่คุณต้องการจัดเก็บการตรวจสอบความถูกต้องหรือข้อมูลที่ละเอียดอ่อนใด ๆ ที่ถูกทำลายเมื่อปิดเบราว์เซอร์คุณสามารถไว้วางใจsessionStorageและlocalStorageส่งข้อความข้ามแท็บได้

โดยพื้นฐานแล้วความคิดคือ:

  1. คุณบูตจากแท็บก่อนหน้านี้ไม่เปิดดังนั้นทั้งของคุณlocalStorageและsessionStorageว่างเปล่า (ถ้าไม่คุณสามารถล้างlocalStorage) localStorageคุณจะต้องลงทะเบียนเป็นผู้ฟังที่เหตุการณ์ข้อความบน
  2. ผู้ใช้รับรองความถูกต้อง / สร้างข้อมูลที่ละเอียดอ่อนบนแท็บนี้ (หรือแท็บอื่น ๆ ที่เปิดในโดเมนของคุณ)
  3. คุณอัปเดต the sessionStorageเพื่อเก็บข้อมูลที่ละเอียดอ่อนและใช้localStorageเพื่อเก็บข้อมูลนี้แล้วลบมัน (คุณไม่สนใจเกี่ยวกับเวลาที่นี่เนื่องจากเหตุการณ์ถูกจัดคิวเมื่อมีการเปลี่ยนแปลงข้อมูล) แท็บอื่น ๆ ที่เปิดในเวลานั้นจะถูกเรียกกลับในเหตุการณ์ข้อความและจะอัปเดตsessionStorageด้วยข้อมูลที่ละเอียดอ่อน
  4. หากผู้ใช้เปิดแท็บใหม่ในโดเมนของคุณแท็บนั้นsessionStorageจะว่างเปล่า รหัสจะต้องตั้งที่สำคัญในการที่localStorage(สำหรับกันตัวอย่าง: req) แท็บอื่น ๆ (ทั้งหมด) จะถูกเรียกกลับในเหตุการณ์ข้อความดูรหัสนั้นและสามารถตอบด้วยข้อมูลที่ละเอียดอ่อนจากsessionStorage(เช่นใน 3) หากมี

โปรดสังเกตว่ารูปแบบนี้ไม่ได้ขึ้นอยู่กับwindow.onbeforeunloadเหตุการณ์ที่มีความเปราะบาง (เนื่องจากเบราว์เซอร์สามารถปิด / พังได้โดยไม่มีเหตุการณ์เหล่านี้เกิดขึ้น) นอกจากนี้เวลาที่ข้อมูลสำคัญถูกเก็บไว้ในlocalStorageนั้นมีขนาดเล็กมาก (เนื่องจากคุณต้องพึ่งพาการตรวจจับการเปลี่ยนแปลงของ transcients สำหรับเหตุการณ์ข้อความข้ามแท็บ) ดังนั้นจึงไม่น่าเป็นไปได้ที่ข้อมูลสำคัญดังกล่าวจะรั่วไหลบนฮาร์ดไดรฟ์ของผู้ใช้

นี่คือตัวอย่างของแนวคิดนี้: http://jsfiddle.net/oypdwxz7/2/


ขอบคุณสำหรับการแก้ไข xryl669 คุณทำได้ดีมาก เมื่อตอนที่ฉันกำลังคิดเกี่ยวกับสิ่งนี้มันจะเป็นการดีที่สุดถ้าจะใช้งานเว็บแชร์ developer.mozilla.org/en-US/docs/Web/API/SharedWorkerในกรณีที่การสนับสนุนเบราว์เซอร์ปัจจุบันไม่เป็นปัญหา
Hacktisch

ใช่คุณสามารถใช้ SharedWorker หรือ BroadcastChannel (หรือ localStorage แบบนี้) แม้ว่าทั้งสองจะไม่มีอยู่ใน Edge โดยทั่วไปวิธีการใด ๆ ที่ข้ามแท็บหน้าต่างข้ามจะทำงาน ความยากลำบากคือการหาคนที่ทำงานได้ทุกที่ด้วยความยุ่งยากน้อยที่สุด
xryl669

1

ไม่มีวิธีตรวจจับเบราว์เซอร์ที่ปิดดังนั้นคุณอาจไม่สามารถลบ localStorage ในการปิดเบราว์เซอร์ แต่มีวิธีอื่นในการจัดการสิ่งที่คุณสามารถใช้ sessionCookies เพราะมันจะทำลายหลังจากปิดเบราว์เซอร์


0

คุณสามารถใช้ sessionStorage เพราะ sessionStorage อนุญาตให้ล้างค่าคีย์ทั้งหมดเมื่อปิดหน้าต่างเบราว์เซอร์

ดูที่นั่น: SessionStorage- MDN


-5

คุณสามารถลองใช้รหัสต่อไปนี้เพื่อลบที่เก็บข้อมูลในตัวเครื่อง:

delete localStorage.myPageDataArr;

29
นี่ไม่ใช่วิธีที่ถูกต้องในการลบคีย์ localStorage คุณควรใช้localStorage.removeItem(key);เพื่อลบรหัส
มอนแทนา

1
ควรใช้ localStorage.removeItem (กุญแจ); ไม่ใช่คำหลักลบ
Rob Evans

@MT ทำไมไม่ใช้delete? ฉันพยายามและมันใช้งานได้ มีผลข้างเคียงหรือสิ่งใดที่เราไม่ควรใช้ลบหรือไม่ ขอบคุณ.
user1995781

2
@ user1995781 การใช้งานdeleteไม่ใช่วิธีปฏิบัติที่ดีที่สุดในlocalStorage
justmyfreak

1
@justmyfreak นั่นไม่ใช่คำตอบ
alvitawa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.