成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JavaScript中sharedWorker 實(shí)現(xiàn)多頁(yè)面通信的實(shí)例詳解

瀏覽:2日期:2023-06-06 10:12:31

是這樣的,今天玩github,先是在沒(méi)有登錄瀏覽了一些頁(yè)面,然后在某一頁(yè)面進(jìn)行了登錄。這時(shí)再切換的其他頁(yè)面時(shí)就看到了下面的提示:

JavaScript中sharedWorker 實(shí)現(xiàn)多頁(yè)面通信的實(shí)例詳解

那么這是怎么做到的呢?我們可以想到,一種辦法是 localStorage,在某一個(gè)頁(yè)面登錄時(shí),修改localStorage 狀態(tài),其他頁(yè)面在顯示的時(shí)候,讀取最新的狀態(tài),然后顯示提示:

// 登錄的頁(yè)面localStorage.setItem(’login’, true);// 其他頁(yè)面document.addEventListener('visibilitychange', function() {if (localStorage.setItem(’login’) === ’true’) {alert(’你已登錄,請(qǐng)刷新頁(yè)面’);}}

然而,github并沒(méi)有這么做,localStorage里也找不到相關(guān)的字段,一番查找之后,發(fā)現(xiàn)他們是用 sharedWorker 實(shí)現(xiàn)的。那我們就來(lái)了解下sharedworker

JavaScript中sharedWorker 實(shí)現(xiàn)多頁(yè)面通信的實(shí)例詳解

什么是sharedWorker

sharedWorker 顧名思義,是 worker 的一種,可以由所有同源的頁(yè)面共享。同Worker的api一樣,傳入js的url,就可以注冊(cè)一個(gè) sharedWorker 實(shí)例:

let myWorker = new SharedWorker(’worker.js’);

但是與普通 Worker 不同的是:1 同一個(gè)js url 只會(huì)創(chuàng)建一個(gè) sharedWorker,其他頁(yè)面再使用同樣的url創(chuàng)建sharedWorker,會(huì)復(fù)用已創(chuàng)建的 worker,這個(gè)worker由那幾個(gè)頁(yè)面共享。2 sharedWorker通過(guò)port來(lái)發(fā)送和接收消息

接下來(lái),我們看一下具體是 worker 和頁(yè)面之間是如何發(fā)送和接收消息的。

messagePort

假設(shè)我們有兩個(gè)js,一個(gè)是跑在頁(yè)面里的 page.js,另一個(gè)是跑在 worker里的 worker.js。那么我們要在 page.js 里注冊(cè)一個(gè) sharedWorker,代碼如下:

// page.jslet myWorker = new SharedWorker(’worker.js’);// page通過(guò)worker port發(fā)送消息myWorker.port.postMessage(’哼哼’);// page通過(guò)worker port接收消息myWorker.port.onmessage = (e) => console.log(e.data);// worker.jsonconnect= function(e) {const port = e.ports[0];port.postMessage(’哈嘿’);port.onmessage = (e) => {console.log(e.data);}}調(diào)試sharedWorker

在上面的例子中,我們?cè)趙orker中使用了console.log來(lái)打印來(lái)自頁(yè)面的message,那么到哪里可以看到打印的log呢?我們可以在瀏覽器地址欄里面輸入 `chrome://inspect,然后在側(cè)邊欄選中shared workers了,就可以看到瀏覽器,目前在運(yùn)行的所有worker。點(diǎn)擊inspect會(huì)打開(kāi)一個(gè)開(kāi)發(fā)者工具,然后就可以看到輸出的log了。

JavaScript中sharedWorker 實(shí)現(xiàn)多頁(yè)面通信的實(shí)例詳解

這里我們看到我們的worker名字是untitled,那是因?yàn)閟haredworker 構(gòu)造函數(shù)還支持傳入第二個(gè)參數(shù)作為名字:

let myWorker = new SharedWorker(’worker.js’, ’awesome worker’);多頁(yè)面發(fā)布消息

回到文章一開(kāi)始的例子,我們前面實(shí)現(xiàn)了頁(yè)面和worker之間的通信,那么該如何讓worker向多個(gè)頁(yè)面發(fā)送消息呢?一個(gè)思路就是我們把port緩存起來(lái),作為一個(gè)port pool,這樣當(dāng)我們需要向所有頁(yè)面廣播消息的時(shí)候,就可以遍歷port,然后發(fā)送消息:

// worker jsconst portPool = [];onconnect= function(e) {const port = e.ports[0];// 在connect時(shí)將 port添加到 portPool中portPool.push(port);port.postMessage(’哈嘿’);port.onmessage = (e) => {console.log(e.data);}}function boardcast(message) {portPool.forEach(port => {port.portMessage(port);})}

這樣我們就基本實(shí)現(xiàn)了向多個(gè)頁(yè)面廣播消息的功能。

清除無(wú)效的port

上面的實(shí)現(xiàn)中有一個(gè)問(wèn)題,就是在頁(yè)面關(guān)閉后,workerPool中的port并不會(huì)自動(dòng)清除,造成內(nèi)存的白白浪費(fèi)。我們可以在頁(yè)面關(guān)閉前通知shared worker頁(yè)面將要關(guān)閉,然后讓worker將無(wú)效的 messagePort 從 portPool 中移除。

// 頁(yè)面window.onbeforeunload = () => { myWorker.port.postMessage(’TO BE CLOSED’);};// worker.jsconst 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);})}

這樣,我們就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的多頁(yè)面廣播的sharedWorker。我們可以用它來(lái)廣播一下時(shí)間:

setInterval(() => boardcast(Date.now()), 1000);

參考

https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker/SharedWorkerhttps://github.com/mdn/simple-shared-worker

到此這篇關(guān)于JavaScript中sharedWorker 實(shí)現(xiàn)多頁(yè)面通信的文章就介紹到這了,更多相關(guān)js sharedWorker多頁(yè)面通信內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
伦理电影国产精品| 精品国产欧美一区二区| 91首页免费视频| 国产91在线观看| 国产精品一区二区男女羞羞无遮挡| 偷拍自拍另类欧美| 调教+趴+乳夹+国产+精品| 一区二区国产视频| 丝袜亚洲精品中文字幕一区| 亚洲一区二区成人在线观看| 亚洲一区在线电影| 日韩精品国产欧美| 精品一区二区三区在线观看| 亚洲国产欧美不卡在线观看| 亚洲视频一二三区| 一级特黄大欧美久久久| 视频一区国产视频| 激情综合色播五月| av电影天堂一区二区在线观看| 91丨国产丨九色丨pron| 好看的日韩av电影| 久久国产一二区| 欧美久久久久久久久久| 亚洲精品一区二区三区福利 | 欧美三级乱码| 亚洲国产日韩精品| 美腿丝袜亚洲综合| 波多野结衣一区二区三区| 欧美激情1区| 蜜桃免费网站一区二区三区| 久久影院电视剧免费观看| 亚洲日本一区二区| 麻豆视频观看网址久久| 成人免费福利片| 99热这里只有精品8| 色综合久久99| wwwwxxxxx欧美| 夜夜嗨av一区二区三区中文字幕| 日韩美女在线视频| 欧美图区在线视频| 国产日韩欧美一区二区三区乱码| 亚洲国产一区在线观看| 国产精品一区二区视频| 亚洲视频欧美在线| 欧美少妇性性性| 国产婷婷色一区二区三区四区| 亚洲电影一区二区| 成人av电影免费观看| 亚洲bt欧美bt精品777| 亚洲网址在线| 欧美日韩p片| 欧美自拍丝袜亚洲| 999亚洲国产精| 97精品久久久久中文字幕| 国产日韩一区欧美| xnxx国产精品| 青青草视频一区| 很黄很黄激情成人| 欧美一级在线观看| 午夜欧美大尺度福利影院在线看| 99免费精品视频| 欧美亚洲综合网| 亚洲男同性恋视频| caoporn国产精品| 国产精品另类一区| 中文一区在线播放| 毛片不卡一区二区| 正在播放亚洲| 一区二区三区我不卡| 欧美精品tushy高清| 一区二区三区四区视频精品免费 | 欧美专区在线| 亚洲欧洲成人自拍| 成人av网站在线| 在线视频一区二区三区| 伊人婷婷欧美激情| 欧美日韩在线播放一区二区| 欧美一级爆毛片| 久久电影网站中文字幕 | 国产亚洲成年网址在线观看| 国产一区二三区| 亚洲一区不卡| 国产精品亚洲一区二区三区妖精| 亚洲高清在线观看一区| 91免费国产在线| 欧美精品电影在线播放| 暖暖成人免费视频| 日韩美女一区二区三区| 久久99国产精品麻豆| 久久蜜桃资源一区二区老牛| 最新日韩av在线| 国产综合色一区二区三区| 欧美精品免费视频| 7777女厕盗摄久久久| 日韩精品一区在线观看| 激情五月播播久久久精品| 色婷婷一区二区三区四区| 亚洲一区二区av电影| 青青草原综合久久大伊人精品 | 7777精品伊人久久久大香线蕉经典版下载 | 色天使久久综合网天天| 一区二区三区成人在线视频| 国产一区二区三区四区三区四| 国产午夜亚洲精品午夜鲁丝片| 成人av网址在线| 久久久久久一二三区| 欧美在线3区| 国产精品久久久久久久久快鸭 | 欧洲国产伦久久久久久久| 欧美性淫爽ww久久久久无| 在线观看不卡| 亚洲精品成人悠悠色影视| 99综合视频| 天堂在线一区二区| 欧美亚男人的天堂| 东方欧美亚洲色图在线| 久久久久久久久一| 精品91视频| av电影在线观看一区| 国产精品伦理在线| 免费国产一区二区| 国产综合色产在线精品| 欧美mv日韩mv| 伊人久久久大香线蕉综合直播| 一区二区三区四区中文字幕| 久久亚洲综合网| 国产精品一区二区免费不卡| 久久久精品日韩欧美| 亚洲高清资源| 免费久久99精品国产| 日韩午夜精品视频| 亚洲区国产区| 狠狠色丁香久久婷婷综合丁香| 2014亚洲片线观看视频免费| 亚洲欧洲一区二区天堂久久| 免费的国产精品| 2019国产精品| 91久久久免费一区二区| 国产一区二区三区国产| 国产视频一区二区三区在线观看| 国产欧美日韩伦理| 国产一区二区精品久久91| 国产视频一区二区在线| 亚洲一区在线免费| 大胆亚洲人体视频| 一个色综合网站| 日韩你懂的在线播放| 99热免费精品在线观看| 国产综合久久久久影院| 亚洲三级在线免费| 欧美一区二区在线免费播放| 亚洲国产专区| 成人免费看黄yyy456| 亚洲自拍都市欧美小说| 欧美绝品在线观看成人午夜影视| 91啪九色porn原创视频在线观看| 亚洲国产精品人人做人人爽| 欧美电视剧免费观看| 国产偷久久久精品专区| www.综合网.com| 看电视剧不卡顿的网站| 中文乱码免费一区二区| 欧美精品亚洲一区二区在线播放| 亚洲精品美女91| 91丨九色丨黑人外教| 美女mm1313爽爽久久久蜜臀| 亚洲人成7777| 久久久久久免费毛片精品| 欧美撒尿777hd撒尿| 国产精品一页| 亚洲视频久久| 91视频免费播放| 男女激情视频一区| 亚洲丝袜另类动漫二区| 2024国产精品| 制服丝袜av成人在线看| 色综合久久88色综合天天6| 亚洲人人精品| 欧美精品尤物在线| 99在线精品一区二区三区| 久久不见久久见免费视频1| 亚洲制服丝袜av| 亚洲精品国产精华液| 国产精品久久免费看| 欧美大片拔萝卜| 欧美日韩免费视频| 欧洲精品在线观看| 久久免费国产| 久久久精品日韩| 免费不卡亚洲欧美| 亚洲一区三区电影在线观看| 精品动漫av| 天堂av在线一区| 91精品久久久久久久久99蜜臂| 色狠狠av一区二区三区| 香蕉久久久久久久av网站| 国产精品美女久久久浪潮软件| 在线看片一区| 日韩精品一二三| 看国产成人h片视频|