电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

JavaScript 如何實現同源通信

瀏覽:105日期: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
相關文章:
主站蜘蛛池模板: pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 发电机组|柴油发电机组-批发,上柴,玉柴,潍柴,康明斯柴油发电机厂家直销 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 紧急泄压人孔_防爆阻火器_阻火呼吸阀[河北宏泽石化] | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 济南宣传册设计-画册设计_济南莫都品牌设计公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 蒸汽吸附分析仪-进口水分活度仪|康宝百科 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 蒸汽吸附分析仪-进口水分活度仪|康宝百科| 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 | 淄博不锈钢,淄博不锈钢管,淄博不锈钢板-山东振远合金科技有限公司 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 |