日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript 如何實現同源通信

瀏覽:196日期:2023-09-29 16:47:44
目錄一、Broadcast Channel API 簡介二、Broadcast Channel API 應用場景2.1 實現同源頁面間數據同步2.2 在其它 Tab 頁面中監測用戶操作三、Broadcast Channel API vs postMessage API四、總結五、參考資源一、Broadcast Channel API 簡介

Broadcast Channel API 可以實現同源下瀏覽器不同窗口、Tab 頁或者 iframe 下的瀏覽器上下文之間的簡單通訊。通過創建一個監聽某個頻道下的 BroadcastChannel 對象,你可以接收發送給該頻道的所有消息。

JavaScript 如何實現同源通信

(圖片來源 —— https://developer.mozilla.org/zh-CN/docs/Web/API/Broadcast_Channel_API)

了解完 Broadcast Channel API 的作用之后,我們來看一下如何使用它:

// 創建一個用于廣播的通信通道const channel = new BroadcastChannel(’my_bus’);// 在my_bus上發送消息channel.postMessage(’大家好,我是阿寶哥’);// 監聽my_bus通道上的消息channel.onmessage = function(e) { console.log(’已收到的消息:’, e.data);};// 關閉通道channel.close();

通過觀察以上示例,我們可以發現 Broadcast Channel API 使用起來還是很簡單的。該 API 除了支持發送字符串之外,我們還可以發送其它對象,比如 Blob、File、ArrayBuffer、Array 等對象。另外,需要注意的是,在實際項目中,我們還要考慮它的兼容性:

JavaScript 如何實現同源通信

(圖片來源 —— https://caniuse.com/?search=Broadcast%20Channel%20API)

由上圖可知,在 IE 11 及以下的版本,是不支持 Broadcast Channel API,這時你就可以考慮使用現成的 broadcast-channel-polyfill 或者基于 localStorage 和 storage 事件來實現。

二、Broadcast Channel API 應用場景

利用 Broadcast Channel API,我們可以輕易地實現同源頁面間一對多的通信。該 API 的一些使用場景如下:

實現同源頁面間數據同步; 在其它 Tab 頁面中監測用戶操作; 指導 worker 執行一個后臺任務; 知道用戶何時登錄另一個 window/tab 中的帳戶。

為了讓大家能夠更好地掌握 Broadcast Channel API,阿寶哥以前面 2 個使用場景為例,來介紹一下該 API 的具體應用。

2.1 實現同源頁面間數據同步

html

<h3 id='title'>你好,</h3><input id='userName' placeholder='請輸入你的用戶名' />

JS

const bc = new BroadcastChannel('abao_channel');(() => { const title = document.querySelector('#title'); const userName = document.querySelector('#userName'); const setTitle = (userName) => { title.innerHTML = '你好,' + userName; }; bc.onmessage = (messageEvent) => { if (messageEvent.data === 'update_title') { setTitle(localStorage.getItem('title')); } }; if (localStorage.getItem('title')) { setTitle(localStorage.getItem('title')); } else { setTitle('請告訴我們你的用戶名'); } userName.onchange = (e) => { const inputValue = e.target.value; localStorage.setItem('title', inputValue); setTitle(inputValue); bc.postMessage('update_title'); };})();

在以上示例中,我們實現了同源頁面間的數據同步。當任何一個已打開的頁面中,輸入框的數據發生變化時,頁面中的 h3#title 元素的內容將會自動實現同步更新。

JavaScript 如何實現同源通信

2.2 在其它 Tab 頁面中監測用戶操作

利用 Broadcast Channel API,除了可以實現同源頁面間的數據同步之外,我們還可以利用它來實現在其它 Tab 頁面中監測用戶操作的功能。比如,當用戶在任何一個 Tab 中執行退出操作后,其它已打開的 Tab 頁面也能夠自動實現退出,從而保證系統的安全性。

html

<h3 id='status'>當前狀態:已登錄</h3><button onclick='logout()'>退出</button>

JS

const status = document.querySelector('#status');const logoutChannel = new BroadcastChannel('logout_channel');logoutChannel.onmessage = function (e) { if (e.data.cmd === 'logout') { doLogout(); }};function logout() { doLogout(); logoutChannel.postMessage({ cmd: 'logout', user: '阿寶哥' });}function doLogout() { status.innerText = '當前狀態:已退出';}

在以上示例中,當用戶點擊退出按鈕后,當前頁面會執行退出操作,同時會通過 logoutChannel 通知其它已打開的頁面執行退出操作。

三、Broadcast Channel API vs postMessage API

與 postMessage() 不同的是,你不再需要維護對 iframe 或 worker 的引用才能與其進行通信:

const popup = window.open(’https://another-origin.com’, ...);popup.postMessage(’Sup popup!’, ’https://another-origin.com’);

Broadcast Channel API 只能用于實現同源下瀏覽器不同窗口、Tab 頁或者 iframe 下的瀏覽器上下文之間的簡單通訊。而 postMessage API 卻可用于實現不同源之間消息通信。由于保證消息來自同一來源,因此無需像以前那樣使用以下方法來驗證消息:

const iframe = document.querySelector(’iframe’);iframe.contentWindow.onmessage = function(e) { if (e.origin !== ’https://expected-origin.com’) { return; } e.source.postMessage(’Ack!’, e.origin);};四、總結

Broadcast Channel API 是一個非常簡單的 API,內部包含了跨上下文通訊的接口。在支持該 API 的瀏覽器中,我們可以利用該 API 輕松地實現同源頁面間的通信。而對于不支持該 API 的瀏覽器來說,我們就可以考慮使用 localStorage 和 storage 事件來解決同源頁面間通信的問題。

五、參考資源

MDN - Broadcast Channel APIBroadcastChannel API: A Message Bus for the Web

以上就是JavaScript 如何實現同源通信的詳細內容,更多關于JavaScript 同源通信的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产精品久久一区免费式| 久久国内精品自在自线400部| 色在线视频观看| 欧美偷窥清纯综合图区| 欧美成人基地 | 卡一精品卡二卡三网站乱码| 精品成人18| 日韩在线网址| 97精品一区| 蜜臀av免费一区二区三区| 激情综合自拍| av亚洲在线观看| 日韩有码av| 日本一二区不卡| 夜夜嗨一区二区| 欧美日韩精品一区二区三区在线观看| 免费观看亚洲天堂| 久久亚洲成人| 日本高清久久| 精精国产xxxx视频在线野外| 日韩精品一二三区| 久久精品国产久精国产| 91亚洲精品视频在线观看 | 亚洲欧洲一区二区天堂久久| 日韩欧乱色一区二区三区在线| 国产人成精品一区二区三| 人在线成免费视频| 男人的天堂久久精品| 国产一区丝袜| 美国欧美日韩国产在线播放| 九九99久久精品在免费线bt| 午夜精品网站| 久久精品一本| 丝瓜av网站精品一区二区 | 日本va欧美va瓶| 精品国产黄a∨片高清在线| 欧美午夜精彩| 久久亚洲国产| 日韩高清一级| 国产精品久久久久毛片大屁完整版| 伊人久久国产| 日韩欧美高清一区二区三区| 999国产精品视频| 亚洲免费精品| 国内精品麻豆美女在线播放视频| 欧美+日本+国产+在线a∨观看| 国产日韩免费| 夜久久久久久| 成人欧美一区二区三区的电影| 亚洲天堂日韩在线| av亚洲一区二区三区| 久久激情五月婷婷| 欧美日韩国产在线一区| 日韩高清不卡一区| 欧美国产免费| 中日韩男男gay无套| 国产精品久久久久77777丨| 国产精品av一区二区| 国产精品v日韩精品v欧美精品网站| 国产精品视频一区二区三区综合| 午夜国产精品视频免费体验区| 老司机精品在线| 日韩精品一区二区三区av| 国产国产精品| 成人免费电影网址| 欧美成人a交片免费看| 午夜久久av | 国产精品欧美三级在线观看| 99成人超碰| 久久久久97| 日韩精品视频网站| 日韩一区亚洲二区| 久久尤物视频| 18国产精品| 蜜桃视频免费观看一区| 国产伦一区二区三区| 欧美二区视频| 激情久久五月| 久久久久久免费视频| 免费观看亚洲| 免费在线成人| 国产精品xvideos88| 国产精品超碰| 精品国产午夜| 国产传媒在线| 伊人精品在线| 精品视频自拍| 99久久亚洲精品| 久久久精品网| 欧美肉体xxxx裸体137大胆| 九色porny丨国产首页在线| 麻豆网站免费在线观看| 国产欧美一区二区三区精品酒店| 精品一区二区三区亚洲| 精品中文在线| 麻豆久久久久久| 精品视频在线观看网站| 亚洲少妇自拍| 亚洲综合欧美| 亚洲一区欧美二区| 亚洲综合三区| 美国三级日本三级久久99| 日韩精品2区| 国产99久久| 一区在线免费| 亚洲人成高清| 国产精品一区亚洲| 激情综合五月| 欧美va天堂| 99久久夜色精品国产亚洲1000部| 最新中文字幕在线播放| 日韩在线不卡| 精品一区毛片| 日韩一区二区三区四区五区| 国产欧美日韩影院| 精品久久久久久久| 久久久久99| 亚洲精品观看| 精品精品99| 亚洲激情二区| 国产一精品一av一免费爽爽| 国产精品久久久久蜜臀| 亚洲电影在线一区二区三区| 色婷婷综合网| 精品资源在线| 日韩国产一区二区| 视频一区二区国产| 国产精品xxx在线观看| 裤袜国产欧美精品一区| 日韩视频免费| 国产精品啊啊啊| 免费观看久久av| 91精品丝袜国产高跟在线| 91亚洲成人| 一区二区三区四区精品视频| 久久一区欧美| 免费黄网站欧美| 欧美午夜网站| 韩国久久久久久| 亚洲精一区二区三区| 国产图片一区| 亚洲第一精品影视| 日韩一区二区三区高清在线观看| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 视频一区二区欧美| 久久免费视频66| 在线综合欧美| 精品三区视频| 男女激情视频一区| 国产aⅴ精品一区二区三区久久 | 日韩专区欧美专区| 国产中文在线播放| 日本中文字幕一区二区| 九九精品调教| 国产日韩欧美中文在线| 欧美精选视频一区二区| 日韩国产专区| 91精品福利| 在线视频亚洲| 亚洲精品影视| 国产亚洲精aa在线看| 欧美精品国产白浆久久久久| 国产福利亚洲| 色老板在线视频一区二区| 精品1区2区3区4区| 欧美日韩一区二区三区四区在线观看| 精品国产不卡一区二区| 免费看日韩精品| 日韩中文在线电影| 国产毛片一区二区三区| 视频在线观看一区| 欧美日韩中文字幕一区二区三区| 国产精品tv| 日韩制服丝袜先锋影音| 99热精品久久| 欧美激情一区| 日本免费一区二区视频| aa亚洲婷婷| 日韩成人亚洲| 91亚洲自偷观看高清| 久久不见久久见免费视频7| 香蕉久久一区| 亚洲影视一区| 毛片不卡一区二区| 麻豆国产91在线播放| 日韩综合一区二区三区| 狠狠色狠狠色综合日日tαg| 最新中文字幕在线播放 | 另类综合日韩欧美亚洲| 日本亚洲视频| 亚洲精品黄色| 午夜天堂精品久久久久| 在线精品福利| 蜜臀国产一区二区三区在线播放 | 日韩大片在线观看| 97精品在线| 女生影院久久| 欧美13videosex性极品| 激情黄产视频在线免费观看| 国产乱码精品一区二区三区四区|