实现多个标签页之间通信的几种方法

示例地址

prologue
  • 之前在网上看到一个面试题:如何实现浏览器中多个标签页之间的通信。我目前想到的方法有三种:使用websocket协议、通过localstorage、以及使用html5浏览器的新特性SharedWorker。
  • websocket这里先不介绍了,全双工(full-duplex)通信自然可以实现多个标签页之间的通信,相信网上通过websocket实现聊天室的教程也不少,我自己也用socket.io写了一个在线聊天室
  • 接下来会介绍另外两个方法:监听localstorage和使用SharedWorker
localstorage
  • localstorage是浏览器多个标签共用的存储空间,所以可以用来实现多标签之间的通信(ps:session是会话级的存储空间,每个标签页都是单独的)。
  • 直接在window对象上添加监听即可:
window.onstorage = (e) => {console.log(e)}
// 或者这样
window.addEventListener('storage', (e) => console.log(e))
复制代码
  • onstorage以及storage事件,针对都是非当前页面对localStorage进行修改时才会触发,当前页面修改localStorage不会触发监听函数。然后就是在对原有的数据的值进行修改时才会触发,比如原本已经有一个key会a值为b的localStorage,你再执行:localStorage.setItem('a', 'b')代码,同样是不会触发监听函数的。
webworker
  • 我们都知道JavaScript是单线程的,但是浏览器是拥有过个线程的比如:gui渲染线程、JS引擎线程、事件触发线程、异步http请求线程。
  • webworker作为浏览器的一个新特性,可以提供一个额外的线程来执行一些js代码,并且不会影响到浏览器用户界面。
  • 应用场景:比如页面中包含耗时较大的算法代码时,就会阻塞线程影响浏览器渲染等等。这时候就可把耗时代码,放到webworker(另一个线程)中执行。
  • 注意,这种多线程能力不是JavaScript语言原生具有的,而是浏览器宿主环境提供的。
  • 普通的webworker直接使用new Worker()即可创建,这种webworker是当前页面专有的。然后还有种共享worker(SharedWorker),这种是可以多个标签页、iframe共同使用的,接下来介绍如何使用SharedWorker实现标签页之间的通信。
SharedWorker
  • SharedWorker可以被多个window共同使用,但必须保证这些标签页都是同源的(相同的协议,主机和端口号)
  • 首先新建一个js文件worker.js,具体代码如下:
// sharedWorker所要用到的js文件,不必打包到项目中,直接放到服务器即可
let data = ''
onconnect = function (e) {
  let port = e.ports[0]

  port.onmessage = function (e) {
    if (e.data === 'get') {
      port.postMessage(data)
    } else {
      data = e.data
    }
  }
}
复制代码
  • webworker端(暂且这样称呼)的代码就如上,只需注册一个onmessage监听信息的事件,客户端(即使用sharedWorker的标签页)发送message时就会触发。

  • 注意webworker无法在本地使用,出于浏览器本身的安全机制,所以我这次的示例也是放在服务器上的,worker.jsindex.html在同一目录。

  • 因为客户端和webworker端的通信不像websocket那样是全双工的,所以客户端发送数据和接收数据要分成两步来处理。示例中会有两个按钮,分别对应的向sharedWorker发送数据的请求以及获取数据的请求,但他们本质上都是相同的事件--发送消息。

  • webworker端会进行判断,传递的数据为'get'时,就把变量data的值回传给客户端,其他情况,则把客户端传递过来的数据存储到data变量中。下面是客户端的代码:

// 这段代码是必须的,打开页面后注册SharedWorker,显示指定worker.port.start()方法建立与worker间的连接
    if (typeof Worker === "undefined") {
      alert('当前浏览器不支持webworker')
    } else {
      let worker = new SharedWorker('worker.js')
      worker.port.addEventListener('message', (e) => {
        console.log('来自worker的数据:', e.data)
      }, false)
      worker.port.start()
      window.worker = worker
    }
// 获取和发送消息都是调用postMessage方法,我这里约定的是传递'get'表示获取数据。
window.worker.port.postMessage('get')
window.worker.port.postMessage('发送信息给worker')
复制代码
  • 页面A发送数据给worker,然后打开页面B,调用window.worker.port.postMessage('get'),即可收到页面A发送给worker的数据。
  • 参考:developer.mozilla.org/zh-CN/docs/…
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RFID原理与应用 实验报告 2016– 2017学年第二学期 级物联网工程专业 课程名称 RFID原理与应用 学 号 姓 名 指导教师 王超梁 2017年 月 日 rfid实验报告全文共11,当前为第1。 rfid实验报告全文共11,当前为第1。 rfid实验报告全文共11,当前为第2。 rfid实验报告全文共11,当前为第2。 实验一 RFID通信系统编解码和调制解调仿真 一、实验目的 射频识别技术是一种通过高频电磁破实现物体识别的无线电技术,一个完整的射频识别系统由射频识别阅读器,射频识别标签和射频识别软件系统三大部分组成,根据工作频段的不同,RFID系统编解码方式、调制解调方式不同,不同的编解码和调制解调方式可以提高RFID系统的通信效率,分析与设计RFID系统中不同编解码算法和调制解调方式具有很强的实用性。分析RFID系统不同编解码算法和调制解调方式,并进行仿真,比较不同编解码算法和调制方式对波形的影响,同时对现有算法进行优化和改进,从而提高RFID系统的效率。 二、实验内容 1. RFID实验箱各模块的划分和作用; 2.RFID电子标签各种编解码算法的仿真; 3. RFID电子标签调制解调的仿真; 4. 记录并截图电子标签各编解码算法和调制解调的波形。 三、预备知识   了解RFID的通信模型和原理;了解调制解调和编解码算法及波形;了解RFI实验箱各模块的功能;了解RFID系统的组成和各部分的作用。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:韩柏电子RFID实验箱一套; 2. 软件环境配置 操作系统:Microsoft Windows 7 Professional Service Pack 1; RFID开发环境:AVR Studio,Miniscope。 五、实验分析 采用Manchester编码方式,对编码数据和解码数据波形的对比。 rfid实验报告全文共11,当前为第3。 rfid实验报告全文共11,当前为第3。 2.采用AM调制方式(AM/FM/PM),对数据ASK调制和解调波形的对比。 六、遇到的问题及解决方法 问题:RFID技术使用 ASK FSK PSK数字调制方法,其他的数字调制方法为什么不适用 方法:1.数字调制解调技术主要有ASK、FSK、PSK和QAM几大类。 2.衡量这些调制技术的指标主要是频率效率和功率效率。由于FSK相关技术具有"恒包络"之特性,故其具有高的功率效率,这对于依赖电池供电的对讲机产品来说尤为重要。 3.目前,专业无线通信中采用的FSK调制技术主要是MSK、GMSK、2FSK和4FSK几种,其中MSK和GMSK是两种特殊的2FSK技术。MSK是最小频移键控调制技术,其信号相较普通的FSK信号具有相位连续性。GMSK则是在MSK的基础上通过引入Gaussian滤波器而进一步降低信号带宽的调制方式。 4.在实际应用中,MSK信号一般用于传输低速数字信号,而GMSK则已在GSM公众无线系统和TETRAPOL、AIS等专业无线通信系统中获得广泛应用。4FSK调制技术则在最近的ETSI之DMR/dPMR标准中获得应用。 rfid实验报告全文共11,当前为第4。 rfid实验报告全文共11,当前为第4。 实验二 RFID125KHZ和13.56MHZ电子标签读写 一、实验目的 熟悉低频和高频RFID系统实现数据传输的原理,掌握125KHZ和13.56MHZ读写器和电子标签的结构及读取原理,观察高频读写器和低频读写器的结构和天线的区别,掌握电子标签的读写方法和多标签读取的防碰撞算法的实现方法。 二、实验内容 125KHZ电子标签数据的读取; 13.56MHZ电子标签数据的单标签和多标签读取; 多标签读取防碰撞算法的仿真; 三、预备知识 了解低频和高频RFID系统实现数据传输的原理;掌握读写器和电子标签的结构以及通信过程;了解多标签读取防碰撞算法的原理;了解不同频率电子标签和读写器的天线结构。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:韩柏电子RFID实验箱一套; 2. 软件环境配置 操作系统:Microsoft Windows 7 Professional Service Pack 1; RFID开发环境:AVR Studio,Miniscope。 五、实验分析 1.125KHZ电子标签读取,电子标签数据和读取数据的对比。 rfid实验报告全文共11,当前为第5。 rfid实验报告全文共11,当前为第5。 2.13.56MHZ电子标签标签读取,电子标签数据和读取数据的对比。 3. 13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值