两个浏览器窗口之间通信(最佳实践)

浏览器跨标签页通信的方式都有什么? 浏览器跨标签页通信的方式 阅读详情

通信分为同源和非同源两类

  1. 同源

  • 自定义事件(不同窗口无效)
消息发送页
new Even("specialData")
window.dispach("specialData", obj)

消息接收页
window.addEventListener("specialData", function(e) {console.log(e)});
  • 监听localStorage
消息发送页
localStorage.setItem('message',JSON.stringify({message: '消息',from: 'Page 1'}))

消息接收页
window.addEventListener("storage", function(e) {console.log(e.key, e.newValue, e.oldValue)});
或者window.onstorage
  • BroadcastChannel
消息发送页
const channel = new BroadcastChannel('example-channel');
channel.postMessage(object);

消息接收页
const channel = new BroadcastChannel('example-channel');
channel.addEventListener('message', (event) => {
received.textContent = event.data;
});
channel.addEventListener('messageerror', (event) => {
console.error(event);
});
或者
const channel = new BroadcastChannel('example-channel');
channel.onmessage = (event) => {
received.textContent = event.data;
};
channel.onmessageerror = (event) => {
console.log(event);
};

// 当完成后,断开与频道的连接,告诉它不要再接收新的消息,并允许它最终被垃圾回收。
  • Service Worker
new Worker()
  • SharedWorker
HTML5 中的 Web Worker 可以分为两种不同线程类型,一个是专用线程 Dedicated Worker,一个是共享线程 Shared Worker。
Dedicated Worker直接使用new Worker()即可创建,这种webworker是当前页面专有的。
SharedWorker可以被多个window、标签页、iframe共同使用,但必须保证这些标签页都是同源的(相同的协议,主机和端口号)。
  1. 非同源

  • document.domain
  • window.name(不同窗口无效)
这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它。

父窗口先打开一个子窗口,载入一个不同源的网页,该网页将信息写入window.name属性。
window.name = data;
接着,子窗口跳回一个与主窗口同域的网址。
window.location.href = ' http://parent.url.com/xxx.html';
然后,主窗口就可以读取子窗口的window.name了。
var data = document.getElementById('iframe的id').contentWindow.name;
  • window.postMessage
仔细看 window.postMessage(),就注定了你首先得拿到window这个对象。 也注定他使用的限制, 两个窗体必须建立起联系。常见建立联系的方式:
window.open
window.opener
iframe
你能获得被打开窗体的句柄,当然也可以直接操作窗体了。

otherWindow.postMessage(message, targetOrigin, [transfer]);
otherWindow:
你想发送跨域消息的那个窗口(你需要通信的目标窗口),而不是自身窗口的window。其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。
message:
将要发送到其他 window的数据。它将会被结构化克隆算法序列化。这意味着你可以不受什么限制的将数据对象安全的传送给目标窗口而无需自己序列化。
targetOrigin:
通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串" "(表示无限制)或者一个URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。这个机制用来控制消息可以发送到哪些窗口;例如,当用postMessage传送密码时,这个参数就显得尤为重要,必须保证它的值与这条包含密码的信息的预期接受者的origin属性完全一致,来防止密码被恶意的第三方截获。如果你明确的知道消息应该发送到哪个窗口,那么请始终提供一个有确切值的targetOrigin,而不是。不提供确切的目标将导致数据泄露到任何对数据感兴趣的恶意站点。
transfer:(可选)
是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
  • WebSocket
所有的WebSocket都监听同一个服务器地址,利用send发送消息,利用onmessage获取消息的变化,不仅能窗口,还能跨浏览器,兼容性最佳,只是需要消耗点服务器资源。
const ws = new WebSocket("ws://localhost:3000/") ws.onopen = function (event) { // 或者把此方法注册到其他事件中,即可与其他服务器通信 ws.send({now : Date.now()}); // 通过服务器中转消息 }; ws.onmessage = function (event) { // 消费消息console.log(event.data); }

还有大佬总结的非常好,可以参考下:

两个浏览器窗口间通信-优快云博客

关于WPF的两个窗口之间简单的数据传递【附源代码】 目标:将窗口1(Window1)的数据传输给窗口2(Window2)。 VS版本:2015 如下图提示建立: 建立窗体1: <Window x:Class="TestTxt.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x= 阅读详情

相关推荐

浏览器跨Tab窗口通信原理及应用实践:探索Web应用的协同工作之道

嗨,各位朋友!艾斯视觉团队向您问好!我们拥有丰富的UI设计和前端开发经验,希望能通过我们的分享为您提供有价值的参考。如有任何疑问或需要帮助,请随时联系我们,让我们一起探索和学习!感恩遇见!

assjokhh的博客 2343

浏览器的两个页面之间通信的问题

两个浏览器窗口间通信总结: 1、localStorage 一个窗口更新localStorage, 另一个窗口监听window对象的”storage”事件,来实现通信。 // 本窗口的设值代码 localStorage.setItem('aaa', (Math.random()*10).toString()) // 其他窗口监听storage事件 window.addEventListener("storage", function (e) { console.log(e) console.log

yiyueqinghui的博客 7228

Web浏览器与Web服务器之间的通信过程

在这个过程中,浏览器发送请求到服务器,服务器处理请求并返回相应的数据给浏览器。本文将详细介绍Web浏览器与Web服务器之间的通信过程,并提供相应的源代码示例。在这个过程中,浏览器发送请求到服务器,服务器处理请求并返回相应的数据给浏览器。在上述示例中,当浏览器发送GET请求到"/data"时,服务器会返回包含JSON数据的响应。在上述示例中,当浏览器发送GET请求到"/data"时,服务器会返回包含JSON数据的响应。以上就是Web浏览器与Web服务器之间的通Web浏览器与Web服务器之间的通信过程。

IunScala的博客 406

JavaScript实现跨标签页通信

💡 在 Web 开发中,有时我们需要实现不同页面之间的数据传递和事件触发,比如一个页面打开了另一个页面,然后在新的页面中操作后需要更新原来的页面的内容。这种场景在电商、支付、社交等领域都很常见,那么如何用js来实现不同页面之间的交互呢?下面提供几种常见的方法供大家学习参考!

TeroZhang的博客 2782

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

极验第四代滑块验证码破解(三):滑块轨迹构造

极验第四代滑块验证码破解(三):滑块轨迹构造声明 声明 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 本文关联文章超链接:

帯泪的鱼的博客 8623

JavaScript怎么实现两个窗口之间的通信?

问题 最近在进行业务开发的时候,遇到一个问题,就是一个页面里面点击打开了一个新的窗口,然后在新的窗口里面保存成功数据之后需要更新前面一个窗口的数据? window.postMessage的简单介绍 一段时间的挣扎,确定了用postMessage实现改功能,没办法,这个再一次涉及到了我的知识盲区。 我们先来看一看MDN上怎么说 简介 【window.postMessage】 window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协

学习前端这门手艺,栈底到栈顶依次是:浏览器架构、Web 网络、事件循环机制、JavaScript 核心、V8 的内存管理、浏览器的渲染流程、Web 安全、CSS、React、Vue、Node、构建工具链等 5134

STM32CubeMX + HAL库避坑指南:为什么你的代码总在SystemClock_Config卡住?

本文深入剖析了STM32开发者在使用STM32CubeMX和HAL库时,代码在SystemClock_Config函数中卡死的根本原因。文章不仅指出硬件时序、Flash延迟配置等常见陷阱,更提供了从硬件设计、软件容错到深度调试的系统性解决方案,帮助开发者构建鲁棒的时钟初始化策略,彻底告别启动卡顿问题。

bb456的博客 928

两个窗口之间的通信

两个窗口之间的通信 1.localstorage 一个窗口更新localStorage,另一个窗口监听window对象的”storage”事件,来实现通信。(localStorage需要同源窗口才能共享,即协议,域名,端口一致) // 本窗口的设值代码 localStorage.setItem('aaa', (Math.random()*10).toString()) // 其他窗口监听stor...

chenzihong123的博客 2549

ADS与Cadence中Verilog-A文件的编译与调用实战指南

本文详细介绍了在ADS与Cadence平台中Verilog-A文件的编译与调用实战指南,涵盖开发环境配置、模型创建与编译、仿真设置技巧以及跨平台协作与调试等内容。通过具体案例和优化策略,帮助工程师高效完成混合信号仿真设计,提升电路建模与验证效率。

weixin_29196315的博客 496

立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输至原子云

本文详细介绍了如何使用立创·庐山派-K230-CanMV开发板,通过ATK-ESP8266 WIFI模块实现图像识别数据的无线传输至原子云平台。内容包括硬件连接、软件环境搭建、AT指令控制、原子云连接及数据上传的全过程,并提供了实用的调试技巧和常见问题解决方案,为物联网应用开发提供了完整实践指南。

potato的博客 741

多个浏览器窗口之间通信

多个浏览器窗口间通信,浏览器通信简单实现,双屏浏览器通信,多屏浏览器通信

qq_38648382的博客 1311

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

本文为软考软件评测师考生提供备考避坑指南,深度解析5个高频失分章节,包括标准化与信息化基础、中间件技术、软件测试模型、白盒测试覆盖准则和性能测试指标。文章结合2024最新考纲,分享实战技巧和记忆口诀,帮助考生精准打击失分重灾区,提升备考效率。

weixin_29223603的博客 467

electron 两个窗口如何通信_聊聊 electron 中实现多窗口之间的通信方式

前言由于自己在使用electron开发一个类似微信的桌面客户端App,开发这个App的目的纯粹是为了总结一下自己对于 electron 的积累总结吧,先贴出项目的源码地址:github.com/1111mp/elec…。目前整个项目的基础架构都实现差不多了,包括整个应用的数据持久化(使用的是 sqlite,因为我比较喜欢用 sequelize)、多语言、主题设置、多窗口之间的通信方式 和 带...

weixin_39790877的博客 4818

Python自动化生成HyperMesh Tcl命令流:从几何建模到有限元分析

本文详细介绍了如何利用Python自动化生成HyperMesh的Tcl命令流,实现从几何建模到有限元分析的全流程二次开发。通过封装常用操作函数,工程师可以高效完成参数化建模、自动网格划分及求解器文件输出,显著提升CAE前处理效率与标准化水平。

weixin_29041767的博客 423

汽车ECU诊断入门:手把手教你用UDS协议(ISO14229)读取和清除故障码

本文详细介绍了如何使用UDS协议(ISO14229)进行汽车ECU诊断,包括故障码读取与清除的完整流程。从诊断环境搭建、UDS协议基础到实战案例分析,手把手教你掌握0x19诊断服务、安全访问机制等核心技能,适用于汽车电子工程师和诊断开发人员。

weixin_33701251的博客 451

JavaScript实现父子两个窗口之间互相通信

JavaScript里面的Dom编程里面的window对象有很多的方法能实现很多特殊的效果,下面我们来列举一些方法,然 后做出一个小案例,就是使用Window对象的opener方法实现父子两方的窗口的对话! 首先是父 窗口的代码 test4.html function test(){//moveto是按照当前屏幕定位窗口,

技术是我的毕生追求 3455

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

两个浏览器窗口间通信

浏览器窗口间通信 补充一下,这里的通讯指遵守同源策略情况下。 为了吸引读者的兴趣,先把demo放到前面: 下面有几个我自己写的演示多页面通讯的demo, 为了正常运行,请用最新的chrome浏览器打开。 demo的源码地址https://github.com/xiangwenhu/page-communication/tree/master/docs 首页 setInterval + sess...

成长的程序世界,一起成长 967

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

electron 父子窗口之间通信和窗口间通信(九)

文章目录参考父子窗口通信electron窗口间通信(渲染进程和主进程事件监听) 参考 总结:子窗口创建及父窗口与子窗口之间通信 electron窗口间通信 父子窗口通信 父页面parent.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial

黄彪博客 6365

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

实现浏览器内多个标签页面之间通信的四种方法

一一演示实现浏览器内多个标签页面之间通信的四种方式并详细解释其原理

weixin_46399753的博客 1万+

如何实现浏览器内多个标签页之间的通信

浏览器内多个标签页之间通信,通俗的讲就是浏览器中开了多个窗口,在其中一个窗口做了一些行为等其他窗口不用刷新也能有相关表现。 cookie+setInterval方式 要想在多个窗口中通信,通信的内容一定不能放在window对象中,因为window是当前窗口的作用域,里面的内容只属于当前窗口。而cookie是浏览器的本地存储机制,和窗口无关。 将要发送的信息写入cookie: var msg = documet.querySelector('#msg'); if(msg.value.trim()

jewfer的博客 4574

浏览器窗口通信的多种方式

» 介绍 WebSocket 是 HTML5 提供的一种在单个 TCP 连接上进行全双工通讯的协议,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 用 nodejs 简单的搭建 websocket 服务实现多页面通信,效果如下: » nodejs搭建websocket服务 新建文件夹 websocket 执行 npm init -y 初始化项目 执行 npm i ws 安装 ws 依赖 新建 server.js 文件 执行 node server.js 启动服

qsya的博客 2121

electron 两个窗口如何通信_Electron中页面之间的通信

Electron的运行环境为Chromium + Node.js, 而Chromium采用的是多进程机制,也就是说每个页面都是一个独立的进程(渲染进程),因此页面之间是没有直接关系的,要想进行通信,需要借助主进程作为桥梁。所以我们首先先来学习主进程和渲染进程怎么通信:1. 渲染进程---->主进程发送端:ipcRenderer.send(channel, data)接收端:ipcMain.o...

weixin_39637700的博客 2632

1. 浏览器跨 Tab 窗口通信原理

浏览器跨 Tab 窗口通信原理

LBJ辉的前端天地 1824

浏览器窗口和标签之间JavaScript通信。

几周前,我已经决定适当解决浏览器窗口之间的相同域核心通信问题。 例如,打开多个页面使用相同的域名的情况,实际上,即使是完全不同的域名,也很容易使用这种想法。 怎么样? 我将为此写另一个文档-但它很简单。 整个想法基于本地网络的工作方式,在解释其工作方式之前,需要解释当前的技术及其存在的问题(在这里我们不是在讨论弹出窗口及其父级)。 通常,浏览器窗口之间有4种通信方式: 使用窗口对象(据...

IT与开发人员的地盘 227
上一篇: Git提交项目到多个远程仓库
下一篇: 项目中动态引入的图片,某些环境下不显示(已解决)
jsPao
博客等级 码龄7年 549粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值