JavaScript 跨窗口通信(Cross-Window Communication)

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

✨ 前言

在现代 Web 开发中,跨窗口通信是一种常见需求。它允许在不同的窗口或框架之间传递数据和消息,从而实现各种功能。

本章将介绍如何在 JavaScript 中实现跨窗口通信。我们将学习以下内容:

  • 跨窗口通信的常见场景
  • 跨窗口通信的不同方法
  • 每种方法的优缺点
  • 如何选择合适的跨窗口通信方法

✨ 正文

在现代浏览器中,出于安全考虑,同源策略限制了不同窗口或框架之间直接访问彼此的 DOM 和 JavaScript 对象。跨窗口通信是指在不同窗口或框架之间传递数据和消息的技术。

跨窗口通信的常见场景:

  • 在不同的窗口或框架之间共享数据
  • 在不同的窗口或框架之间触发事件
  • 在不同的窗口或框架之间控制彼此的行为

跨窗口通信的方法:

  • Window.opener
  • Window.postMessage
  • Local Storage
  • IndexedDB
  • WebRTC

Window.opener

简介

window.opener 属性允许从一个窗口访问打开它的窗口。

示例:

// 在新窗口中打开一个页面
var newWindow = window.open('https://www.baidu.com', '_blank');// 在新窗口中获取打开它的窗口
var openerWindow = newWindow.opener;// 在新窗口中向打开它的窗口发送消息
openerWindow.postMessage('Hello from the new window!');

缺点:

  • 仅限于父子窗口之间通信
  • 依赖于打开窗口的页面仍然存在

Window.postMessage

简介

window.postMessage() 方法允许在不同窗口或框架之间安全地传递消息。

示例:

// 在第一个窗口中发送消息
window.postMessage('Hello from the first window!', '*');// 在第二个窗口中接收消息
window.addEventListener('message', function(event) {console.log('Received message:', event.data);
});

 

参数:

  • message: 要发送的数据
  • targetOrigin: 目标窗口的源(可选)

优点:

  • 可以在任意窗口或框架之间通信
  • 不依赖于任何特定的页面或窗口

缺点:

  • 无法直接访问对方的 DOM 或 JavaScript 对象

Local Storage

简介

localStorage 对象允许在浏览器中存储数据,即使关闭窗口或浏览器也不会丢失。

示例:

// 在第一个窗口中存储数据
localStorage.setItem('key', 'value');// 在第二个窗口中读取数据
var value = localStorage.getItem('key');

优点:

  • 可以在任意窗口或框架之间共享数据
  • 数据持久化

缺点:

  • 存储空间有限
  • 无法存储复杂的数据结构

IndexedDB

简介

IndexedDB 是一个 NoSQL 数据库,允许在浏览器中存储大量数据。

示例:

// 在第一个窗口中打开数据库
var db = indexedDB.open('my-database');// 在第一个窗口中存储数据
db.onsuccess = function(event) {var objectStore = db.result.createObjectStore('my-object-store');objectStore.add({key: 'key', value: 'value'});
};// 在第二个窗口中读取数据
var db = indexedDB.open('my-database');db.onsuccess = function(event) {var objectStore = db.result.createObjectStore('my-object-store');objectStore.get('key').onsuccess = function(event) {console.log('Received value:', event.target.result.value);};
};

优点:

  • 可以存储大量数据
  • 可以存储复杂的数据结构

缺点:

  • 使用起来比较复杂

WebRTC

简介

WebRTC 允许在浏览器之间建立实时通信。

示例:

// 在第一个窗口中建立连接
var peerConnection = new RTCPeerConnection();// 在第二个窗口中接受连接
var peerConnection = new RTCPeerConnection();// 在第一个窗口中发送数据
peerConnection.ondatachannel = function(event) {var dataChannel = event.channel;dataChannel.onmessage = function(event) {console.log('Received message:', event.data);};
};// 在第二个窗口中发送数据
var dataChannel = peerConnection.createDataChannel('my-channel');
dataChannel.send('Hello from the second window!');

优点:

  • 可以实现实时通信
  • 可以传输任意类型的数据

缺点:

  • 使用起来比较复杂

总结

跨窗口通信是 Web 开发中常见需求,有多种方法可以实现。每种方法都有其优缺点,选择哪种方法取决于具体的应用场景。

以下是一些选择跨窗口通信方法的建议:

  • 如果需要在父子窗口之间通信,可以使用 window.opener
  • 如果需要在任意窗口或框架之间通信,可以使用 window.postMessage()
  • 如果需要共享数据,可以使用 localStorage 或 IndexedDB
  • 如果需要实现实时通信,可以使用 WebRTC

参考资料

  • JavaScript 教程 - 跨窗口通信: 跨窗口通信
  • MDN Web Docs - 跨窗口通信: <移除了无效网址>

附加内容

代码示例

以下是一些更复杂的跨窗口通信示例:

  • 使用 window.postMessage() 在两个窗口之间传递对象:
    // 在第一个窗口中发送对象
    var obj = {name: 'John Doe',age: 30
    };
    window.postMessage(obj, '*');// 在第二个窗口中接收对象
    window.addEventListener('message', function(event) {var obj = event.data;console.log('Received object:', obj);
    });
    

  • 使用 localStorage 在多个窗口之间共享购物车:
    // 在第一个窗口中添加商品到购物车
    localStorage.setItem('cart', JSON.stringify([{name: 'Product A', price: 100}]));// 在第二个窗口中查看购物车
    var cart = JSON.parse(localStorage.getItem('cart'));
    console.log('Cart:', cart);
    

  • 使用 IndexedDB 在多个窗口之间存储联系人信息:
    // 在第一个窗口中存储联系人信息
    var db = indexedDB.open('my-database');db.onsuccess = function(event) {var objectStore = db.result.createObjectStore('my-object-store');objectStore.add({name: 'John Doe', phone: '123-456-7890'});
    };// 在第二个窗口中读取联系人信息
    var db = indexedDB.open('my-database');db.onsuccess = function(event) {var objectStore = db.result.createObjectStore('my-object-store');objectStore.get('John Doe').onsuccess = function(event) {console.log('Received contact:', event.target.result);};
    };
    

  • 使用 WebRTC 在两个窗口之间进行视频通话:
    // 在第一个窗口中建立连接
    var peerConnection = new RTCPeerConnection();// 在第二个窗口中接受连接
    var peerConnection = new RTCPeerConnection();// 在第一个窗口中获取本地视频流
    navigator.mediaDevices.getUserMedia({video: true}).then(function(stream) {var videoElement = document.getElementById('video');videoElement.srcObject = stream;// 将本地视频流添加到连接中peerConnection.addStream(stream);
    });// 在第二个窗口中播放远程视频流
    peerConnection.ondatachannel = function(event) {var dataChannel = event.channel;dataChannel.onmessage = function(event) {var videoElement = document.getElementById('video');videoElement.srcObject = new MediaStream(event.data);};
    };// 在第一个窗口中发送视频流
    peerConnection.createOffer().then(function(offer) {peerConnection.setLocalDescription(offer);peerConnection.sendOffer(offer);
    });// 在第二个窗口中接受视频流
    peerConnection.onicecandidate = function(event) {if (event.candidate) {peerConnection.addIceCandidate(event.candidate);}
    };peerConnection.onnegotiationneeded = function() {peerConnection.createAnswer().then(function(answer) {peerConnection.setLocalDescription(answer);peerConnection.sendAnswer(answer);});
    };
    

    高级主题

  • 跨域通信: 跨源资源共享(CORS) - HTTP | MDN
  • 安全性: Web 安全 | MDN

 

✨ 结语

本章介绍了如何在 JavaScript 中实现跨窗口通信。我们学习了六种常用的跨窗口通信方法:

  • window.opener
  • window.postMessage
  • localStorage
  • IndexedDB
  • WebRTC
  • Broadcast Channel

每种方法都有其优缺点,选择哪种方法取决于具体的应用场景。

以下是一些选择跨窗口通信方法的建议:

  • 如果需要在父子窗口之间通信,可以使用 window.opener
  • 如果需要在任意窗口或框架之间通信,可以使用 window.postMessage
  • 如果需要共享数据,可以使用 localStorage 或 IndexedDB
  • 如果需要实现实时通信,可以使用 WebRTC
  • 如果需要在多个窗口或框架之间广播消息,可以使用 Broadcast Channel

本章还提供了一些代码示例,帮助您理解如何使用这些方法。

希望以上内容对您有所帮助。

以下是一些需要进一步学习的主题:

  • 跨域通信
  • 安全性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器和云计算之间有什么关系?

云计算与服务器之间的关系是密切而复杂的。首先&#xff0c;我们需要明确一点&#xff0c;云计算并不是一种全新的技术&#xff0c;而是对现有技术的一种整合和改进。在这个基础上&#xff0c;我们可以更好地理解云计算与服务器之间的关系。 服务器是云计算的重要组成部分之一…

如何在Linux上部署1Panel运维管理面板并实现无公网ip远程访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

Python中使用opencv-python库进行颜色检测

Python中使用opencv-python库进行颜色检测 之前写过一篇VC中使用OpenCV进行颜色检测的博文&#xff0c;当然使用opencv-python库也可以实现。 在Python中使用opencv-python库进行颜色检测非常简单&#xff0c;首选读取一张彩色图像&#xff0c;并调用函数imgHSV cv2.cvtColor…

华为 Huawei 交换机 黑洞MAC地址的作用和配置示例

黑洞mac作用&#xff1a;某交换机上配置某个PC的mac地址为黑洞mac&#xff0c;那么这台PC发出来的包都会被交换机丢弃&#xff0c;不会被转发到网络中。 组网需求&#xff1a; 如 图 2-13 所示&#xff0c;交换机 Switch 收到一个非法用户的访问&#xff0c;非法用户的 MAC 地址…

C++新版本特性

目录: 前言 C11的常用新特性 auto类型推导&#xff1a; auto的限制&#xff1a; auto的应用&#xff1a; decltype类型推导&#xff1a; decltype的实际应用&#xff1a; 使用using 定义别名&#xff1a; 支持函数模板的默认模板参数 : tuple元组&#xff1a; 列表初…

每日OJ题_位运算①_位运算解题方法+3道OJ

目录 位运算算法原理 ①力扣191. 位1的个数 解析代码 ②力扣338. 比特位计数 解析代码 ③力扣461. 汉明距离 解析代码 位运算算法原理 常见位运算解题方法&#xff1a; 1. 基础位运算&#xff1a; &&#xff1a;按位与&#xff0c;有0就是0 | &#xff1a;按位或&a…

C++分支语句

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家新年快乐&#xff0c;今天&#xff0c;我们来了解一下分支语句。 文章目录 1.什么是分支语句 1.if语句 基本形式 用法说明 练习 2.if-else语句 基本形式 用法说明 练习 3.switch语句 基本形式…

LeetCode 热题 100 | 链表(中下)

目录 1 19. 删除链表的倒数第 N 个节点 2 24. 两两交换链表中的节点 3 25. K 个一组翻转链表 4 138. 随机链表的复制 菜鸟做题第三周&#xff0c;语言是 C 1 19. 删除链表的倒数第 N 个节点 到底是节点还是结点。。。 解题思路&#xff1a; 设置双指针 left 和 ri…

云安全的基本概念(基本目标与指导方针)

目录 一、云安全概念概述 1.1 概述 二、云安全的基本目标 2.1 安全策略开发模型 2.1.1 信息安全三元组 2.1.1.1 保密性(Confidentiality) 2.1.1.2 完整性(Integrity) 2.1.1.3 可用性(Availability) 2.1.2 信息安全三元组的局限性 2.2 其他信息安全属性 2.2.1 真实性 …

Java基础知识练习题

1.对Java源文件进行编译操作的命令是&#xff08;B&#xff09; A.Java B.javac C.where is java D.javaw 2.下列命令中&#xff0c;用来运行Java程序的是&#xff08;A&#xff09;A.java B. javadoc C. jar D. javac 分析&#xff1a; 对Java源程序进行编译的命令是J…

踩坑实录(Third Day)

临近年关&#xff0c;同事们该回家的也都回家了&#xff0c;所以我对工作的欲望不是很强烈&#xff0c;所以就主要是自己学习了一下&#xff0c;在 B 站看看视频&#xff0c;自己敲代码&#xff0c;所以今天没遇到什么坑&#xff0c;但是可以分享一下之前踩到的两个坑。 此为第…

电商小程序04实现登录逻辑

目录 1 创建自定义方法2 获取用户名和密码3 验证用户是否同意协议4 验证用户名和密码总结 上一篇我们实现了登录功能的前端界面&#xff0c;这一篇实现一下登录的具体逻辑。 1 创建自定义方法 一般如果页面点击按钮需要有事件响应的&#xff0c;我们用自定义方法来实现。打开我…

第四篇:数据库安装(命令行)

数据库命令行界面安装 mysql官网&#xff0c;下载解压 https://dev.mysql.com/downloads/mysql/ 在安装之前先去检查一下,本地计算机的用户合组 winr(输入lusrmgr.msc) -点击组-双击administrator 如果只有这两个,那么就添加一下,提高网络服务的权限(避免出现mysql启动失败) …

MySQL之体系结构

华子目录 MySQL简介MySQL的特性MySQL版本MySQL常见版本 数据库排名网站MySQL结构体系查看最大连接数查询缓存配置情况 一条SQL语句执行流程 MySQL简介 MySQL是一个小型关系数据库管理系统&#xff0c;开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年…

springboot项目启动报错:dynamic-datasource can not find primary datasource

项目启动报错信息 Caused by: com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException: dynamic-datasource can not find primary datasourceat com.baomidou.dynamic.datasource.DynamicRoutingDataSource.determinePrimaryDataSource(DynamicRoutingDat…

编程实例分享,手表养护维修软件钟表维修开单管理系统教程

编程实例分享&#xff0c;手表养护维修软件钟表维修开单管理系统教程 一、前言 以下教程以 佳易王钟表维护维修管理系统软件V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 左侧为导航栏&#xff0c; 1、系统设置&#xff1a;可以设置打…

【深度学习】pytorch 与 PyG 安装(pip安装)

【深度学习】pytorch 与 PyG 安装&#xff08;pip安装&#xff09; 一、PyTorch安装和配置&#xff08;一&#xff09;、安装 CUDA&#xff08;二&#xff09;、安装torch、torchvision、torchaudio三个组件&#xff08;1&#xff09;下载镜像文件&#xff08;2&#xff09;创建…

【网络技术】【Kali Linux】Nmap嗅探(二)多设备扫描

上期实验博文&#xff1a;&#xff08;一&#xff09;简单扫描 一、实验环境 本次实验进行Nmap多设备扫描&#xff0c;实验使用 Kali Linux 虚拟机&#xff08;扫描端&#xff09;、Ubuntu 22.04虚拟机&#xff08;被扫描端1&#xff09;、Ubuntu 18.04虚拟机&#xff08;被扫…

【力扣】快乐数,哈希集合 + 快慢指针 + 数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数 getNext(n) &#xff0c;返回 n 的所有位的平方和。一直执行 ngetNext(n) &#xff0c;最终只有 2 种可能&#xff1a; n 停留在 1 。无限循环且不为 1 。 证明&#xff1a;情况 1 是存在的&#xff0c;如力扣的示例一…

嵌入式学习之Linux入门篇笔记——15,Linux编写第一个自己的命令

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是命令&#xff1f; 命令就是可执行程序。 比如 ls -a…