数学建模社区-数学中国

标题: js实现浏览器不同页签之间通信 [打印本页]

作者: 2744557306    时间: 2024-3-29 17:50
标题: js实现浏览器不同页签之间通信
一. 使用BroadcastChannel
9 C5 a' K, I) l7 k7 _: ~
$ R+ \. R$ `7 P) e, D3 k) @const sendMsg = new BroadcastChannel('logout_channel')' E- E% j2 h% C# B8 B# S7 w
sendMsg.postMessage('清除缓存')2 A2 W! e' L/ c
onMsg.onmessage = async (event) => {: {$ t% e/ ?  ^+ h
   console.log('event清除缓存', event.data)
/ k5 p0 Q! l' X9 K! a5 a- L" ]1 t9 i, y}
( X, E  N0 [. h
/ i6 w4 Q8 x8 |二. 使用SharedWorker3 r; R& @' Z. v' D0 ]
1.创建一个SharedWorker实例,并在其中编写处理消息的代码。# K4 V  Y0 d0 C* f5 I$ E
1 R/ |! X! k* b6 B
// shared-worker.js7 N1 S/ K. E6 _% C  F. w5 x4 F! G
onconnect = function(e) {
8 C! D6 @- @  T4 i3 l  var port = e.ports[0];
0 U! z) q& |3 o, l2 o. [) O. ]: r& R6 a
  port.onmessage = function(e) {
# X: p, f! W  A  b4 e5 K/ h7 E    var message = e.data;* e) D% C1 T3 Z
    // 在这里处理接收到的消息9 r# T5 ~9 A/ M: o+ y, S& V' C0 O- j
  };* |8 I5 A& t$ O) b! l5 R
0 k" _* T6 q3 i) g! K
  port.start();8 d) k# P  x" W7 L8 c! K9 m# k
};
9 Q7 G7 I8 H# x, E' a
5 q0 b/ k1 t8 e4 g8 d在多个窗口中分别创建SharedWorker的端口,并发送消息。* c7 }  B/ s* @) v. z8 E
// window1.js
! O; T( @" g# @2 O1 ~3 ?var worker = new SharedWorker('shared-worker.js');
  }  N. Y1 d1 m% v8 j$ Zvar port = worker.port;9 t- O2 t% m3 u/ D: Y! Y$ N! g. I2 t
9 J+ r9 P5 a) k7 F
port.onmessage = function(e) {
! y* ?  V# T0 \4 C- n  var message = e.data;
" F& P* p' e% }# X- \  // 在这里处理接收到的消息% Q' A0 m5 }9 o( m
};1 m8 i! s- O/ M" R$ T1 e

) [: l. h, O! q- N! H5 T4 {9 [5 Gport.postMessage('Hello from window1!');
- A3 h; K( V9 |( B) J  D/ @/ h1 s/ r3 d8 L8 @- E* r& l
// window2.js1 j7 `1 D, k* @: n
var worker = new SharedWorker('shared-worker.js');
- R! S# N  m, `( g+ Evar port = worker.port;, U9 D# L! @% t% l4 {! b4 B6 o

! I" ^9 c' T; T1 ?. eport.onmessage = function(e) {
: |; P, F; F4 {5 e' {  var message = e.data;
# N1 j1 _! y  O/ \% e  // 在这里处理接收到的消息
3 i0 D! v4 M- i/ S% h: c- P};
1 |: X8 M* V( N/ s8 U- K2 _6 S( ^- k6 r
port.postMessage('Hello from window2!');1 `4 G$ P; ^3 ]. @2 Q
) R' \4 P+ c) |% J
在SharedWorker中处理接收到的消息,并向所有连接的窗口发送消息。: `: ~! s, V' H
// shared-worker.js) f5 I+ w6 w% G8 I! I$ h
onconnect = function(e) {
% i9 L$ V0 J' w! T3 [8 K  var port = e.ports[0];
7 K1 h) K0 Y: L  ?( |( N$ J) m& \- k8 d1 i
  port.onmessage = function(e) {. i! r) Z, n& c' L, _: N, z, `! N
    var message = e.data;
2 y0 @/ |4 C* c/ c' O- C    // 在这里处理接收到的消息" U1 Q# i+ z4 l! M* ]7 }5 B: h

& D' a" p; _: y    // 向所有连接的窗口发送消息
% ]/ h, T% o' C) G    e.source.postMessage('Hello from SharedWorker!');2 _% ]  k9 p, {! X
  };9 }: h7 q' \% t1 b1 P! r! e) H
/ K" ]; {& o( i, r* U& p
  port.start();
& }7 @- {/ D; o: W};
8 g2 R! F% s" u8 T, V& }9 m
  W9 ^2 s$ p9 p4 C8 A+ K" {5 N6 _! n/ u2 P7 }

' K* D  B/ l. M




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5