您现在的位置是:网站首页> 编程资料编程资料
html5中sharedWorker实现多页面通信的示例代码HTML5新特性 多线程(Worker SharedWorker)
2021-08-30
1325人已围观
简介 这篇文章主要介绍了html5中sharedWorker实现多页面通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
是这样的,今天玩github,先是在没有登录浏览了一些页面,然后在某一页面进行了登录。这时再切换的其他页面时就看到了下面的提示:

那么这是怎么做到的呢?我们可以想到,一种办法是 localStorage,在某一个页面登录时,修改localStorage 状态,其他页面在显示的时候,读取最新的状态,然后显示提示:
// 登录的页面 localStorage.setItem('login', true); // 其他页面 document.addEventListener("visibilitychange", function() { if (localStorage.setItem('login') === 'true') { alert('你已登录,请刷新页面'); } }然而,github并没有这么做,localStorage里也找不到相关的字段,一番查找之后,发现他们是用 sharedWorker 实现的。那我们就来了解下sharedworker

什么是sharedWorker
sharedWorker 顾名思义,是 worker 的一种,可以由所有同源的页面共享。同Worker的api一样,传入js的url,就可以注册一个 sharedWorker 实例:
let myWorker = new SharedWorker('worker.js');但是与普通 Worker 不同的是:
1 同一个js url 只会创建一个 sharedWorker,其他页面再使用同样的url创建sharedWorker,会复用已创建的 worker,这个worker由那几个页面共享。
2 sharedWorker通过port来发送和接收消息
接下来,我们看一下具体是 worker 和页面之间是如何发送和接收消息的。
messagePort
假设我们有两个js,一个是跑在页面里的 page.js,另一个是跑在 worker里的 worker.js。那么我们要在 page.js 里注册一个 sharedWorker,代码如下:
// page.js let myWorker = new SharedWorker('worker.js'); // page通过worker port发送消息 myWorker.port.postMessage('哼哼'); // page通过worker port接收消息 myWorker.port.onmessage = (e) => console.log(e.data); // worker.js onconnect= function(e) { const port = e.ports[0]; port.postMessage('哈嘿'); port.onmessage = (e) => { console.log(e.data); } }调试sharedWorker
在上面的例子中,我们在worker中使用了console.log来打印来自页面的message,那么到哪里可以看到打印的log呢?我们可以在浏览器地址栏里面输入 `chrome://inspect,然后在侧边栏选中shared workers了,就可以看到浏览器,目前在运行的所有worker。点击inspect会打开一个开发者工具,然后就可以看到输出的log了。

这里我们看到我们的worker名字是untitled,那是因为sharedworker 构造函数还支持传入第二个参数作为名字:
let myWorker = new SharedWorker('worker.js', 'awesome worker');多页面发布消息
回到文章一开始的例子,我们前面实现了页面和worker之间的通信,那么该如何让worker向多个页面发送消息呢?一个思路就是我们把port缓存起来,作为一个port pool,这样当我们需要向所有页面广播消息的时候,就可以遍历port,然后发送消息:
// worker js const portPool = []; onconnect= function(e) { const port = e.ports[0]; // 在connect时将 port添加到 portPool中 portPool.push(port); port.postMessage('哈嘿'); port.onmessage = (e) => { console.log(e.data); } } function boardcast(message) { portPool.forEach(port => { port.portMessage(port); }) }这样我们就基本实现了向多个页面广播消息的功能。
清除无效的port
上面的实现中有一个问题,就是在页面关闭后,workerPool中的port并不会自动清除,造成内存的白白浪费。我们可以在页面关闭前通知shared worker页面将要关闭,然后让worker将无效的 messagePort 从 portPool 中移除。
// 页面 window.onbeforeunload = () => { myWorker.port.postMessage('TO BE CLOSED'); }; // worker.js const portPool = []; onconnect = function(e) { var port = e.ports[0]; portPool.push(port); port.onmessage = function(e) { console.log(e); if (e.data === 'TO BE CLOSED') { const index = ports.findIndex(p => p === port); portPool.splice(index, 1); } var workerResult = 'Result: ' + (e.data[0] * e.data[1]); port.postMessage(workerResult); } } function boardcast(message) { portPool.forEach(port => { port.portMessage(port); }) }这样,我们就实现了一个简单的多页面广播的sharedWorker。我们可以用它来广播一下时间:
setInterval(() => boardcast(Date.now()), 1000);
参考
https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker/SharedWorker
https://github.com/mdn/simple-shared-worker
到此这篇关于html5中sharedWorker实现多页面通信的示例代码的文章就介绍到这了,更多相关html5 sharedWorker多页面通信内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
相关内容
- Html5通过数据流方式播放视频的实现HTML5 播放 RTSP 视频的实例代码html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
- HTML5中 rem适配方案与 viewport 适配问题详解Html5移动端网页端适配(js+rem)详解html5页面 rem 布局适配方法html5中JavaScript removeChild 删除所有节点
- HTML5轮播图全代码纯HTML和CSS实现JD轮播图效果
- HTML+CSS+JS实现图片的瀑布流布局的示例代码3种方式实现瀑布流布局小结小程序瀑布流解决左右两边高度差距过大的问题css3 column实现卡片瀑布流布局的示例代码HTML5 canvas 瀑布流文字效果的示例代码用CSS3实现瀑布流布局的示例代码CSS3实现瀑布流布局与无限加载图片相册的实例代码CSS3使用多列制作瀑布流css和js实现瀑布流效果示例HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
- html+css+jquery模仿搜索风云榜选项卡效果有截图html5使用html2canvas实现浏览器截图的示例HTML5+CSS3模仿优酷视频截图功能示例canvas与html5实现视频截图功能示例Html5新特性用canvas标签画多条直线附效果截图HTML5在canvas中绘制复杂形状附效果截图HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)使用HTML截图并保存为本地图片的实现代码
- html+css+javascript实现列表循环滚动示例代码利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端) 用CSS3实现无限循环的无缝滚动的实例代码
- textarea文本域宽度和高度width及height自动适应实现代码如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度div模拟textarea文本域实现高度自适应效果代码css textarea 高度自适应,无滚动条做一个能自适应高度的textarea的示例代码
- HTML中div与span的区别(共同点与不同点)关于div中img,span垂直居中的问题深入理解DIV和SPAN的区别浅谈Span和Div的区别div与span的区别和使用示例DIV和SPAN垂直居中对齐的实现方法div与span之间有什么区别html的基本使用包括链接、样式表、span和div等等区别div和span、relative和absolute、display和visibilityHTML中div和span比较_动力节点Java学院整理
- HTML仿命令行界面具体实现纯html+css实现Element loading效果纯html+css实现奥运五环的示例代码HTML+CSS实现导航条下拉菜单的示例代码html+css实现滚动到元素位置显示加载动画效果纯html+css实现打字效果html+css实现环绕倒影加载特效html输入两个数实现加减乘除功能html中显示特殊符号(附带特殊字符对应表)关于html选择框创建占位符的问题html css3不拉伸图片显示效果
- 谈谈html转义字符如何通过代码识别在线HTML转义/反转义工具HTML/XML转义字符对照表HTML字符实体(Character Entities) 转义字符串(Escape Sequence)最常用的HTML转义字符 Escape Sequencehtml中常用的转义字符总结
