การสื่อสารระหว่างแท็บหรือหน้าต่าง


176

ฉันค้นหาวิธีการสื่อสารระหว่างหลายแท็บหรือหลายหน้าต่างในเบราว์เซอร์ (ในโดเมนเดียวกันไม่ใช่ CORS) โดยไม่ทิ้งร่องรอย มีวิธีแก้ปัญหาหลายประการ:

  1. ใช้วัตถุหน้าต่าง
  2. postMessage
  3. คุ้กกี้
  4. localStorage

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

วิธีที่สองโดยใช้ postMessage อาจเปิดใช้การสื่อสารข้ามจุดกำเนิด แต่เกิดปัญหาเช่นเดียวกับวิธีแรก คุณต้องบำรุงรักษาวัตถุหน้าต่าง

วิธีที่สามใช้คุกกี้เก็บข้อมูลบางอย่างในเบราว์เซอร์ซึ่งดูเหมือนว่าสามารถส่งข้อความไปยัง windows ทั้งหมดในโดเมนเดียวกันได้อย่างมีประสิทธิภาพ แต่ปัญหาคือคุณไม่สามารถรู้ได้เลยว่าแท็บทั้งหมดอ่าน "ข้อความ" แล้วหรือไม่มาก่อน การทำความสะอาด. คุณต้องใช้การหมดเวลาบางประเภทเพื่ออ่านคุกกี้เป็นระยะ นอกจากนี้คุณถูก จำกัด ด้วยความยาวคุกกี้สูงสุดซึ่งก็คือ 4KB

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

แก้ไข 2018: คำตอบที่ได้รับการยอมรับยังคงใช้ได้ แต่มีวิธีแก้ปัญหาที่ใหม่กว่าสำหรับเบราว์เซอร์สมัยใหม่เพื่อใช้ BroadcastChannel ดูคำตอบอื่น ๆ สำหรับตัวอย่างง่ายๆที่อธิบายวิธีการส่งข้อความระหว่างแท็บโดยง่ายโดยใช้ BroadcastChannel



ฉันสร้างไลบรารีบน localStorage และ sessionStorage เพื่อจัดการที่เก็บข้อมูลฝั่งไคลเอ็นต์ คุณสามารถทำสิ่งต่าง ๆ เช่น storageManager.savePermanentData ('data', 'key'); หรือ storageManager.saveSyncedSessionData ('data', 'key'); ขึ้นอยู่กับว่าคุณต้องการให้ข้อมูลทำงานอย่างไร มันลดความซับซ้อนของกระบวนการจริงๆ บทความเต็มรูปแบบที่นี่: ebenmonney.com/blog/…
adentum


2
ฉันสร้างไลบรารี่ sysend.js เมื่อไม่กี่ปีที่ผ่านมาในเวอร์ชั่นล่าสุดมันใช้ BroadcastChannel คุณสามารถทดสอบไลบรารี่ได้โดยเปิดหน้านี้สองครั้งjcubic.pl/sysend.phpนอกจากนี้ยังสามารถใช้งานกับต้นกำเนิดที่แตกต่างกันได้หากคุณมี iframe proxy
jcubic

ฉันพิจารณาโดเมนย่อยเป็นแหล่งกำเนิดเดียวกันหรือไม่ ฉันหมายความว่าฉันมีโดเมนต่ำกว่าสามโดเมนพวกเขาสื่อสารผ่านทางสถานีออกอากาศหรือไม่ alpha.firstdomain.com, beta.firstdomain.com, gama.firstdomain.com
Tejas Patel

คำตอบ:


142

แก้ไข 2018: คุณควรใช้ BroadcastChannel เพื่อจุดประสงค์นี้ดูคำตอบอื่น ๆ ด้านล่าง แต่ถ้าคุณยังต้องการใช้ localstorage เพื่อการสื่อสารระหว่างแท็บให้ทำเช่นนี้:

เพื่อให้ได้รับการแจ้งเตือนเมื่อแท็บส่งข้อความไปยังแท็บอื่นคุณเพียงแค่ผูกเหตุการณ์ 'พื้นที่จัดเก็บ' ในทุกแท็บให้ทำสิ่งนี้:

$(window).on('storage', message_receive);

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

// use local storage for messaging. Set message in local storage and clear it right away
// This is a safe way how to communicate with other tabs while not leaving any traces
//
function message_broadcast(message)
{
    localStorage.setItem('message',JSON.stringify(message));
    localStorage.removeItem('message');
}


// receive message
//
function message_receive(ev)
{
    if (ev.originalEvent.key!='message') return; // ignore other keys
    var message=JSON.parse(ev.originalEvent.newValue);
    if (!message) return; // ignore empty msg or msg reset

    // here you act on messages.
    // you can send objects like { 'command': 'doit', 'data': 'abcd' }
    if (message.command == 'doit') alert(message.data);

    // etc.
}

ดังนั้นเมื่อแท็บของคุณเชื่อมโยงกับเหตุการณ์ onstorage และคุณได้นำฟังก์ชั่นทั้งสองนี้มาใช้คุณสามารถถ่ายทอดข้อความไปยังแท็บอื่น ๆ ที่กำลังเรียกตัวอย่างเช่น:

message_broadcast({'command':'reset'})

โปรดจำไว้ว่าการส่งข้อความเดียวกันที่แน่นอนสองครั้งจะถูกเผยแพร่เพียงครั้งเดียวดังนั้นหากคุณต้องการทำซ้ำข้อความให้เพิ่มตัวระบุที่ไม่ซ้ำกันให้กับพวกเขาเช่น

message_broadcast({'command':'reset', 'uid': (new Date).getTime()+Math.random()})

โปรดจำไว้ว่าแท็บปัจจุบันที่เผยแพร่ข้อความนั้นไม่ได้รับจริง ๆ มีเพียงแท็บหรือหน้าต่างอื่นในโดเมนเดียวกัน

คุณอาจถามว่าจะเกิดอะไรขึ้นหากผู้ใช้โหลดหน้าเว็บอื่นหรือปิดแท็บของเขาหลังจากการโทร setItem () ก่อนหน้า RemoveItem () จากการทดสอบของฉันเองเบราว์เซอร์จะหยุดการโหลดจนกว่าmessage_broadcast()จะเสร็จสิ้นการทำงานทั้งหมด ฉันทดสอบว่าใส่รอบนานมากสำหรับ () และยังรอให้รอบเสร็จก่อนปิด หากผู้ใช้ฆ่าแท็บในระหว่างนั้นเบราว์เซอร์จะไม่มีเวลาเพียงพอในการบันทึกข้อความไปยังดิสก์ดังนั้นวิธีการนี้ดูเหมือนจะเป็นวิธีที่ปลอดภัยสำหรับฉันในการส่งข้อความโดยไม่มีร่องรอย ยินดีต้อนรับความคิดเห็น


1
คุณสามารถเพิกเฉยต่อเหตุการณ์ลบก่อนที่จะเรียกใช้ JSON.parse () ได้หรือไม่
dandavis

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

1
ฉันทำบางสิ่งบางอย่างที่เกี่ยวข้องในขณะที่กลับมา: danml.com/js/localstorageevents.jsนั้นมีฐาน emmiter เหตุการณ์และ "ก้องท้องถิ่น" เพื่อให้คุณสามารถใช้ EE สำหรับทุกสิ่งทุกที่
dandavis

7
Safari ไม่รองรับ BroadcastChannel - caniuse.com/#feat=broadcastchannel
Srikanth

1
เพียงแค่หัวขึ้นคุณยังสามารถใช้แรงงานที่ใช้ร่วมกัน: developer.mozilla.org/en-US/docs/Web/API/SharedWorker (ซึ่งได้รับการสนับสนุนที่ดีกว่าเบราว์เซอร์)
Seblor

116

มี API ที่ทันสมัยเฉพาะสำหรับวัตถุประสงค์นี้ - Broadcast Channel

มันง่ายเหมือน:

var bc = new BroadcastChannel('test_channel');

bc.postMessage('This is a test message.'); /* send */

bc.onmessage = function (ev) { console.log(ev); } /* receive */

ไม่จำเป็นต้องให้ข้อความเป็นเพียง DOMString วัตถุชนิดใดก็ได้ที่สามารถส่งได้

น่าจะเป็นนอกเหนือจากความสะอาดของ API มันเป็นประโยชน์หลักของ API นี้ - ไม่มีวัตถุการทำให้เป็นสตริง

ขณะนี้รองรับเฉพาะใน Chrome และ Firefox แต่คุณสามารถค้นหาโพลีฟิลที่ใช้ localStorage


3
เดี๋ยวก่อนคุณจะรู้ได้อย่างไรว่าข้อความมาจากไหน? มันไม่สนใจข้อความที่มาจากแท็บเดียวกันหรือไม่
AturSams

2
@zehelvion: ผู้ส่งจะไม่ได้รับตามตัวอย่างเช่นภาพรวมที่ดีนี้ นอกจากนี้คุณสามารถใส่ข้อความลงไปได้ตามต้องการ ID บางส่วนของผู้ส่งหากจำเป็น
Sz.

7
มีโครงการที่ดีที่รวมคุณสมบัตินี้ไว้ในห้องสมุดข้ามเบราว์เซอร์ที่นี่: github.com/pubkey/broadcast-channel
james2doyle

มีสัญญาณสาธารณะใด ๆ จาก Safari เกี่ยวกับการสนับสนุน API นี้ที่จะลงจอดในเบราว์เซอร์นั้นหรือไม่?
Casey

@AturSams คุณตรวจสอบว่า MessageEvent.origin, MessageEvent.source หรือ MessageEvent.ports เป็นสิ่งที่คุณต้องการ เช่นเคยเอกสารเป็นสถานที่ที่ดีที่สุดในการเริ่มต้น: developer.mozilla.org/en-US/docs/Web/API/MessageEvent
Stefan Mihai Stanescu

40

สำหรับผู้ที่ค้นหาโซลูชันที่ไม่ได้อิงกับ jQuery นี่เป็นโซลูชัน JavaScript เวอร์ชันธรรมดาที่จัดทำโดย Thomas M:

window.addEventListener("storage", message_receive);

function message_broadcast(message) {
    localStorage.setItem('message',JSON.stringify(message));
}

function message_receive(ev) {
    if (ev.key == 'message') {
        var message=JSON.parse(ev.newValue);
    }
}

1
เหตุใดคุณจึงไม่โทร RemoveItem
Tomas M

2
ฉันแค่มุ่งเน้นไปที่ความแตกต่างระหว่าง jQuery และ JavaScript
Nacho Coloma

ฉันมักจะใช้ lib เพราะ polyfill และความเป็นไปได้ของคุณสมบัติที่ไม่รองรับ!
Amin Rahimi

20

Checkout AcrossTabs - การสื่อสารที่ง่ายระหว่างแท็บเบราว์เซอร์ข้ามจุดกำเนิด มันใช้การผสมผสานระหว่างpostMessageและsessionStorage API เพื่อให้การสื่อสารง่ายขึ้นและเชื่อถือได้มากขึ้น


มีวิธีการที่แตกต่างกันและแต่ละคนมีข้อดีและข้อเสียของตัวเอง ให้พูดคุยกัน:

  1. LocalStorage

    ข้อดี :

    1. ที่จัดเก็บข้อมูลบนเว็บสามารถดูได้ง่ายว่าเป็นการปรับปรุงคุกกี้ซึ่งให้ความจุที่มากกว่า ถ้าคุณดูซอร์สโค้ด Mozilla เราจะเห็นว่า5120KB ( 5MBซึ่งเท่ากับ2.5 ล้านตัวอักษร)บน Chrome) เป็นขนาดพื้นที่เก็บข้อมูลเริ่มต้นสำหรับทั้งโดเมน สิ่งนี้ทำให้คุณมีพื้นที่ในการทำงานมากกว่าคุกกี้ 4KB ทั่วไป
    2. ข้อมูลจะไม่ถูกส่งกลับไปยังเซิร์ฟเวอร์สำหรับทุกคำขอ HTTP (HTML, รูปภาพ, JavaScript, CSS, ฯลฯ ) - ลดปริมาณการรับส่งข้อมูลระหว่างไคลเอ็นต์และเซิร์ฟเวอร์
    3. ข้อมูลที่เก็บไว้ใน localStorage ยังคงมีอยู่จนกว่าจะถูกลบอย่างชัดเจน การเปลี่ยนแปลงที่ทำจะถูกบันทึกและพร้อมใช้งานสำหรับการเข้าชมเว็บไซต์ในปัจจุบันและอนาคตทั้งหมด

    ข้อเสีย :

    1. มันทำงานบนนโยบายที่มาเดียวกันเดียวกัน ดังนั้นข้อมูลที่จัดเก็บจะสามารถใช้ได้กับแหล่งกำเนิดเดียวกันเท่านั้น
  2. คุ้กกี้

    ข้อดี:

    1. เมื่อเปรียบเทียบกับคนอื่นแล้วไม่มีอะไร AFAIK

    จุดด้อย:

    1. ขีด จำกัด 4K ใช้สำหรับคุกกี้ทั้งหมดรวมถึงชื่อค่าวันหมดอายุ ฯลฯ เพื่อรองรับเบราว์เซอร์ส่วนใหญ่ให้เก็บชื่อไว้ต่ำกว่า 4,000 ไบต์และขนาดคุกกี้โดยรวมต่ำกว่า 4093 ไบต์
    2. ข้อมูลจะถูกส่งกลับไปยังเซิร์ฟเวอร์สำหรับทุกคำขอ HTTP (HTML, รูปภาพ, JavaScript, CSS, ฯลฯ ) - เพิ่มปริมาณการรับส่งข้อมูลระหว่างไคลเอ็นต์และเซิร์ฟเวอร์

      โดยทั่วไปแล้วสิ่งต่อไปนี้จะได้รับอนุญาต:

      • 300คุกกี้
      • 4096 ไบต์ต่อคุกกี้
      • 20 คุกกี้ต่อโดเมน
      • 81920 ไบต์ต่อโดเมน (ให้ 20 คุกกี้ที่มีขนาดสูงสุด 4096 = 81920 ไบต์)
  3. sessionStorage

    ข้อดี:

    1. มันคล้ายกับ localStorageมันคล้ายกับ
    2. การเปลี่ยนแปลงมีให้เฉพาะต่อหน้าต่าง (หรือแท็บในเบราว์เซอร์เช่น Chrome และ Firefox) การเปลี่ยนแปลงที่ทำจะถูกบันทึกและพร้อมใช้งานสำหรับหน้าปัจจุบันรวมถึงการเยี่ยมชมเว็บไซต์ในอนาคตบนหน้าต่างเดียวกัน เมื่อปิดหน้าต่างการจัดเก็บข้อมูลจะถูกลบ

    จุดด้อย:

    1. ข้อมูลมีอยู่ในหน้าต่าง / แท็บที่ตั้งค่าไว้เท่านั้น
    2. ข้อมูลไม่คงที่นั่นคือข้อมูลจะหายไปเมื่อปิดหน้าต่าง / แท็บ
    3. เช่นเดียวกับlocalStoragett ทำงานในนโยบายต้นทางเดียวกัน ดังนั้นข้อมูลที่จัดเก็บจะสามารถใช้ได้กับแหล่งกำเนิดเดียวกันเท่านั้น
  4. PostMessage

    ข้อดี:

    1. เปิดใช้การสื่อสารข้ามจุดกำเนิดอย่างปลอดภัย
    2. ในฐานะที่เป็นจุดข้อมูลการใช้งาน WebKit (ใช้โดย Safari และ Chrome) ในปัจจุบันไม่ได้บังคับใช้ข้อ จำกัด ใด ๆ (นอกเหนือจากที่กำหนดโดยหน่วยความจำไม่เพียงพอ)

    จุดด้อย:

    1. จำเป็นต้องเปิดหน้าต่างจากหน้าต่างปัจจุบันและจากนั้นสามารถสื่อสารได้ตราบใดที่คุณเปิดหน้าต่างค้างไว้
    2. ความกังวลด้านความปลอดภัย - การส่งสตริงผ่านทาง postMessage คือคุณจะรับเหตุการณ์ postMessage อื่น ๆ ที่เผยแพร่โดยปลั๊กอิน JavaScript อื่น ๆ ดังนั้นให้แน่ใจว่าได้ติดตั้ง atargetOriginและการตรวจสอบสติสำหรับข้อมูลที่ส่งผ่านไปยังผู้ฟังข้อความ
  5. การรวมกันของPostMessage + SessionStorage

    การใช้ postMessage เพื่อสื่อสารระหว่างหลายแท็บและในเวลาเดียวกันโดยใช้ sessionStorage ในแท็บ / หน้าต่างที่เพิ่งเปิดใหม่ทั้งหมดเพื่อยืนยันข้อมูลที่ถูกส่งผ่าน ข้อมูลจะคงอยู่ตราบใดที่แท็บ / หน้าต่างยังคงเปิดอยู่ ดังนั้นแม้ว่าแท็บ / หน้าต่างที่เปิดจะถูกปิดแท็บ / หน้าต่างที่เปิดอยู่จะมีข้อมูลทั้งหมดแม้หลังจากรีเฟรช

ฉันได้เขียนไลบรารี JavaScript สำหรับสิ่งนี้ชื่อAcrossTabsซึ่งใช้ postMessage API เพื่อสื่อสารระหว่างแท็บ / หน้าต่างแบบ cross-origin และ sessionStorage เพื่อคงเอกลักษณ์ของแท็บ / หน้าต่างที่เปิดอยู่ตราบใดที่ยังมีชีวิตอยู่


ใช้AcrossTabsเป็นไปได้ไหมที่จะเปิดเว็บไซต์อื่นในแท็บอื่นและนำข้อมูลจากเว็บไซต์นั้นไปสู่แท็บหลัก ฉันจะมีรายละเอียดการรับรองความถูกต้องสำหรับเว็บไซต์อื่น
Madhur Bhaiya

1
ใช่คุณสามารถ @MadhurBhaiya
softvar

ข้อได้เปรียบที่ใหญ่ที่สุดของคุกกี้คือช่วยให้สามารถข้ามโดเมนเดียวกันซึ่งเป็นประโยชน์โดยทั่วไปเมื่อคุณมีชุดของต้นกำเนิดเช่น "a.target.com", "b.target.com" เป็นต้น
StarPinkER

7

อีกวิธีที่ผู้คนควรพิจารณาใช้คือ Shared Workers ฉันรู้ว่ามันเป็นแนวคิดที่ทันสมัย ​​แต่คุณสามารถสร้างการถ่ายทอดใน Shared Worker ที่เร็วกว่าการจัดเก็บในพื้นที่และไม่ต้องการความสัมพันธ์ระหว่างหน้าต่างหลัก / ลูกตราบใดที่คุณยังอยู่ในจุดกำเนิดเดียวกัน

ดูคำตอบของฉันที่นี่สำหรับการสนทนาที่ฉันทำเกี่ยวกับเรื่องนี้


7

มีองค์ประกอบที่มาเปิดเล็ก ๆ ไปจนถึงการซิงค์เป็น / สื่อสารระหว่างแท็บ / หน้าต่างของแหล่งกำเนิดเดียวกัน (ข้อจำกัดความรับผิดชอบ! - ฉันเป็นหนึ่งในผู้ร่วมสมทบ) localStorageตามรอบ

TabUtils.BroadcastMessageToAllTabs("eventName", eventDataString);

TabUtils.OnBroadcastMessage("eventName", function (eventDataString) {
    DoSomething();
});

TabUtils.CallOnce("lockname", function () {
    alert("I run only once across multiple tabs");
});

https://github.com/jitbit/TabUtils

ป.ล. ฉันใช้เสรีภาพในการแนะนำที่นี่เนื่องจากส่วนประกอบ "ล็อค / mutex / sync" ส่วนใหญ่ล้มเหลวในการเชื่อมต่อ websocket เมื่อเหตุการณ์เกิดขึ้นเกือบจะพร้อมกัน


6

ฉันสร้างห้องสมุดsysend.js แล้วแล้วมันมีขนาดเล็กมากคุณสามารถตรวจสอบซอร์สโค้ดของมันได้ ห้องสมุดไม่มีการอ้างอิงภายนอกใด ๆ

คุณสามารถใช้เพื่อการสื่อสารระหว่างแท็บ / หน้าต่างในเบราว์เซอร์และโดเมนเดียวกัน ไลบรารีใช้ BroadcastChannel ถ้าสนับสนุนหรือเหตุการณ์หน่วยเก็บข้อมูลจาก localStorage

API ง่ายมาก:

sysend.on('foo', function(message) {
    console.log(message);
});
sysend.broadcast('foo', {message: 'Hello'});
sysend.broadcast('foo', "hello");
sysend.broadcast('foo'); // empty notification

เมื่อเบราว์เซอร์ของคุณรองรับ BroadcastChannel มันจะส่งวัตถุตามตัวอักษร (แต่จริงๆแล้วเป็นเบราว์เซอร์ต่อเนื่องโดยอัตโนมัติ) และหากไม่ใช่เบราว์เซอร์ต่อเนื่องเป็น JSON ก่อน

เวอร์ชันล่าสุดยังมีตัวช่วย API เพื่อสร้างพร็อกซีสำหรับการสื่อสารข้ามโดเมน (ต้องการไฟล์ html เดียวในโดเมนเป้าหมาย)

นี่คือการสาธิต

แก้ไข :

เวอร์ชั่นใหม่ยังรองรับการสื่อสารข้ามโดเมนหากคุณรวมproxy.htmlไฟล์พิเศษไว้ในโดเมนเป้าหมายและproxyฟังก์ชั่นการโทรจากโดเมนต้นทาง:

sysend.proxy('https://target.com');

(proxy.html เป็นไฟล์ html ที่ง่ายมากที่มีเพียงแท็กสคริปต์เดียวกับไลบรารี)

หากคุณต้องการการสื่อสารสองทางคุณต้องทำสิ่งเดียวกันบนtarget.comโดเมน

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


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

4

ฉันสร้างโมดูลที่ใช้งานได้ดีกับBroadcastchannelอย่างเป็นทางการแต่มีทางเลือกตาม localstorage, indexeddb และ unix-sockets สิ่งนี้ทำให้แน่ใจว่ามันจะทำงานได้แม้กับ Webworkers หรือ NodeJS ดูpubkey: BroadcastChannel


1

ฉันเขียนบทความเกี่ยวกับเรื่องนี้ในบล็อกของฉัน: http://www.ebenmonney.com/blog/how-to-implement-remember-me-functionality-using-token-based-authentication-and-localstorage-in-a- เว็บแอพลิเคชันเว็บแอพลิเคชัน

การใช้ไลบรารี่ที่ฉันสร้างขึ้นstorageManagerคุณสามารถทำได้ดังนี้:

storageManager.savePermanentData('data', 'key'): //saves permanent data
storageManager.saveSyncedSessionData('data', 'key'); //saves session data to all opened tabs
storageManager.saveSessionData('data', 'key'); //saves session data to current tab only
storageManager.getData('key'); //retrieves data

มีวิธีการที่สะดวกสบายอื่น ๆ เช่นกันในการจัดการสถานการณ์อื่น ๆ เช่นกัน


0

นี่เป็นstorageส่วนพัฒนาของTomas Mสำหรับ Chrome เราต้องเพิ่มผู้ฟัง

window.addEventListener("storage", (e)=> { console.log(e) } );

โหลด / บันทึกรายการในที่จัดเก็บข้อมูลที่ไม่ได้ดำเนินการกิจกรรมนี้ - เราต้องเรียกใช้ด้วยตนเองโดย

window.dispatchEvent( new Event('storage') ); // THIS IS IMPORTANT ON CHROME

และตอนนี้แท็บที่เปิดทั้งหมดจะได้รับเหตุการณ์

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