跨页面通信、如何监听 LocalStorage 的变化【storage 事件】

news/2024/7/19 14:50:26 标签: js, 小程序, 前端

场景:当涉及到同时打开多个tab页,操作一个tab,希望其他的tab也会同时进行更新状态。

原理就是前度的跨页面通信

一、【同源通信】LocalStorage

1 当 LocalStorage 变化时,会触发storage事件。

在需要改变的页面增加时间监听:

window.addEventListener('storage', function (e) {
    if (e.key === 'ctc-msg') {
        const data = JSON.parse(e.newValue);
        const text = '[receive] ' + data.msg + ' —— tab ' + data.from;
        console.log('[Storage I] receive message:', text);
    }
});

2 调用 window.localStorage.setItem() 触发更新。

这里需要注意,当两次 setItem 更新的值一样时,监听方法是不会触发的。

二、【非同源通信】iframe

我们有两个不同域名的产品线,也希望它们下面的所有页面之间能无障碍地通信。那该怎么办呢?

要实现该功能,可以使用一个用户不可见的 iframe 作为“桥”。由于 iframe
与父页面间可以通过指定origin来忽略同源限制,因此可以在每个页面中嵌入一个 iframe
(例如:http://sample.com/bridge.html),而这些 iframe 由于使用的是一个
url,因此属于同源页面,其通信方式可以复用上面第一部分提到的各种方式。 页面与 iframe 通信非常简单,首先需要在页面中监听iframe 发来的消息,做相应的业务处理:

/* 业务页面代码 */
window.addEventListener('message', function (e) {
    // …… do something
});

然后,当页面要与其他的同源或非同源页面通信时,会先给 iframe 发送消息:

/* 业务页面代码 */
window.frames[0].window.postMessage(mydata, '*');

复制代码其中为了简便此处将postMessage的第二个参数设为了’*’,你也可以设为 iframe 的 URL。 iframe
收到消息后,会使用某种跨页面消息通信技术在所有 iframe 间同步消息,例如下面使用的 Broadcast Channel:

/* iframe 内代码 */
const bc = new BroadcastChannel('AlienZHOU');
// 收到来自页面的消息后,在 iframe 间进行广播
window.addEventListener('message', function (e) {
    bc.postMessage(e.data);
});    

其他 iframe 收到通知后,则会将该消息同步给所属的页面:

/* iframe 内代码 */
// 对于收到的(iframe)广播消息,通知给所属的业务页面
bc.onmessage = function (e) {
    window.parent.postMessage(e.data, '*');
};

下图就是使用 iframe 作为“桥”的非同源页面间通信模式图。
在这里插入图片描述

参考链接:https://juejin.cn/post/6844903811232825357


http://www.niftyadmin.cn/n/909238.html

相关文章

OpenCV中的三种图像数据结构CvMat,IplImage和Mat(一)CvMat

本文为原创,若有错误的地方欢迎批评指正! 先说区别,它们三个都可以代表和显示图像,但是Mat类型侧重于数学计算,出现在opencv2.0版本之后,其用法与Matlab中的操作非常类似,opencv对其数学计算进行…

[转]分支 合并

http://energykey.iteye.com/blog/512745 两种不一样,第二种好像好用点: http://www.open-open.com/lib/view/open1346982569725.html ---------------------------------------------------------------------------------------------- 使用svn几年了,…

Day_6作业_模拟人生

as #!/usr/bin/env python # encoding: utf-8 class wisdom(object):def __init__(self,n,g):self.n nself.g gdef dist(self): #所有可能分配方案if self.n 1:yield [self.g]returnfor i in range(self.g, -1, -1):#步长-1 递减for d in wisdom(self.n-1, self.g-i).dist()…

LightOJ1257 Farthest Nodes in a Tree (II)(树的点分治)

题目给一棵树,边带有权值,求每一点到其他点路径上的最大权和。 树上任意两点的路径都可以看成是经过某棵子树根的路径,即路径权两个点到根路径权的和,于是果断树分治。 对于每次分治的子树,计算其所有结点到根的距离&a…

HQ-day3 C#语句实例②成绩甄别

Console.Write("请输入学生姓名&#xff1a;"); string name Console.ReadLine(); Console.Write("请输入学生成绩&#xff1a;"); double grade double.Parse(Console.ReadLine()); if (grade > 0 && grade < 100) { if (grade 100) { C…

3.07课·········if分支语句

语句分类&#xff1a;顺序语句&#xff0c;选择语句&#xff08;分支语句&#xff09;&#xff0c;循环语句 分支语句&#xff1a;&#xff08;一&#xff09;if(表达式) //表达式返回值是True或False{}说明&#xff1a;1.表达式返回的是bool值&#xff1b;2.小括号和花括号后面…

如何得到WAV文件播放的总时间

如何得到WAV文件播放的总时间&#xff1f; 1、直接读取wav文件头信息&#xff0c;从文件起始地址偏移28个字节长度为4个字节保存的是每秒钟播放的字节数&#xff0c;从文件起始地址偏移40个字节长度为4个字节保存的是声音数据的总的字节数&#xff0c;相除就是播放时间。 2、…

hdu 1561 The more, The Better(树形dp入门)

http://acm.hdu.edu.cn/showproblem.php?pid1561 树形dp: 1 #include<iostream>2 #include<cstring>3 #include<vector>4 using namespace std;5 6 const int mx222;7 int dp[mx][mx];8 vector<int>g[mx];9 10 void dfs(int x,int m) 11 { 12 if…