数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-29 17:50
标题: js实现浏览器不同页签之间通信
一. 使用BroadcastChannel3 L; f% M+ b' j% F3 d2 d* m4 F/ a
! m9 T/ R5 G% F
const sendMsg = new BroadcastChannel('logout_channel')
5 n, E4 D0 v; m& z: h; |/ osendMsg.postMessage('清除缓存')
9 t( s$ L! J8 d' \+ V6 ponMsg.onmessage = async (event) => {) L- ^7 I1 x+ o
   console.log('event清除缓存', event.data)& X, I( G# e7 b6 v4 E$ z2 d, c
}( B0 V" c  ]" s- H% K$ J( `

* L; Q; |* z. q" v/ v) E- c二. 使用SharedWorker
2 t9 Y' S+ n4 n5 F+ T3 i2 ?! C1.创建一个SharedWorker实例,并在其中编写处理消息的代码。
5 P0 z' ~& @+ o; A, V! n
7 `: g+ b! O: I% u1 r: b* U// shared-worker.js( `7 N, a/ B" n  o0 r7 Z; ]
onconnect = function(e) {
$ C+ v: {; A5 D  var port = e.ports[0];0 e# O! q5 t. A; y

. K" ~2 q2 \' H, g  port.onmessage = function(e) {, q9 M+ L6 D$ q; x3 r7 S2 M& _- h
    var message = e.data;) Y4 R+ v# L( h# R$ p+ {% x- W
    // 在这里处理接收到的消息( `. U0 q3 f# k$ T% U1 t
  };0 g& b/ {# ~& A0 A; F
2 L7 N1 G/ ?$ ]* R% g
  port.start();2 C; I0 u4 {; B% h! Z0 @% Z
};+ y7 d" ~8 e# r' O/ o

3 S0 w$ Q9 b4 i$ v! r) _- s在多个窗口中分别创建SharedWorker的端口,并发送消息。6 }# I; V% S  ?& ~( H- i
// window1.js
4 ~5 q$ \; E) \$ cvar worker = new SharedWorker('shared-worker.js');
+ S3 V% }. @/ B, bvar port = worker.port;
/ @$ ?' r+ S* X, {/ }) \: Y" S. H. d; P9 U0 k
port.onmessage = function(e) {: S2 s) ]$ C+ m0 \
  var message = e.data;
9 K  R/ m( l4 m7 L  z- p" Z" k  // 在这里处理接收到的消息
9 W8 o1 I8 ?' g* V/ o  J};- l1 W, R) z' `( L8 M3 e* d1 S' z" U8 _

2 |2 d9 w' @* a7 {  nport.postMessage('Hello from window1!');
/ d7 O' }( n- O. ^7 x, S* i7 T: z9 h9 l
// window2.js" @! k4 O+ m+ v. j
var worker = new SharedWorker('shared-worker.js');
1 ~( c) _0 u* b/ D! bvar port = worker.port;2 F+ ]" Z8 e% |; X
2 G0 H# q- x& p& d5 n9 a5 e2 t# @
port.onmessage = function(e) {. i8 e* x5 ^! I) |7 H7 f
  var message = e.data;: w% E; T$ w& F3 {4 S
  // 在这里处理接收到的消息% n5 X; s2 `9 o: D8 A  r! _
};! k) t2 D3 n/ p  h8 Y
6 t$ t7 U8 A7 b, t! @
port.postMessage('Hello from window2!');
/ N# t' D2 P( p6 x- R. x( i# M! E( u& F3 f" a: `8 g& y0 q& r
在SharedWorker中处理接收到的消息,并向所有连接的窗口发送消息。7 L; {( B: _: N0 R& q, p0 Z; h
// shared-worker.js0 h: Y, k% A8 l$ D
onconnect = function(e) {
* _2 o$ y" a7 G: |. M& ?  var port = e.ports[0];
0 B3 Y! W- k5 d8 M  L9 F% w/ c* n+ f. m6 l+ s
  port.onmessage = function(e) {
7 y: S" l  x1 {    var message = e.data;' h8 Z' H4 g; U# @2 }
    // 在这里处理接收到的消息
$ O  q% \& r0 K' [1 t1 d" _* Y0 K6 @7 |) E) E
    // 向所有连接的窗口发送消息; ~% n# Y. z8 A0 ]( m2 s) f
    e.source.postMessage('Hello from SharedWorker!');
; C; @7 A- U8 c. ^  };+ X3 X9 J/ A( K6 A7 v$ C0 B
8 r+ U# }6 @, I, x0 j8 X
  port.start();* [6 u9 a& E+ Q& ?0 h
};- L+ G( `5 C0 T
+ r( ?, u* @/ c4 N/ D! [& L

0 s2 y9 \/ c* b) T' P* ]% U- [. v
+ {3 N/ o7 R  n: [, s




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