同一瀏覽器跨標籤頁跨域通訊方案

2021-10-06 17:39:02 字數 1138 閱讀 6819

假如乙個需求需要a頁和b頁c頁等進行相互通訊,並且有第三個頁開啟時,接收之前的最後一條訊息或是全部的歷史訊息,如何優雅的實現呢?

【跨標籤頁通訊方案】

通過監聽storage 事件

通過shareworker

broadcastchannel

方案1:通過儲存事件,會用多餘的觸發及清理訊息的額外開銷及儲存極易被看到,個人感覺不是很理想

方案2 : 貌似還不錯,處理歷史訊息極其方便,關閉標籤頁也不存在清理歷史訊息的問題,

方案3: 這個api實現上極為方便,不足之處是瀏覽器支援不如前兩個,safari 及ie不支援

以上3個方案都存在乙個問題,跨域的問題,同源標籤頁可以,但是如果是跨域就需要額外處理,沒有什麼跨域問題是乙個iframe 不能解決的,如果有那就放兩個。

【shareworker 跨域 方案】

假如使用shareworker,首先在c域下放署乙個中間頁,它負責在c域下起乙個shareworker, a域標籤頁通過iframe嵌入c域公共頁,並在頁面載入完成後初始化shareworker,並且開始監聽來自shareworker 的訊息,如果有訊息則把訊息通知給父頁,a 頁如果想要通知其它標籤頁訊息,則通過iframe 將訊息由c域下的頁面 發到shareworker 再由shareworker 把訊息**給各自標籤頁的中間頁,中間頁再把訊息通過iframe交給父頁,簡單的說是這樣。說到底標籤頁相互通訊主要靠的還是shareworker 的特性,iframe 只是解決跨域的橋梁,下面呼剩一下一件事情,那就是處理iframe 域通訊,有了它,任意網域名稱標籤頁都可能相互通訊。

【ifrme跨域通訊問題】

iframe  父子頁同樣存在跨域的問題,可靠的解決iframe 通訊的手段有

postmessage 父子頁通過postmessage 來通訊,這個方案相容性極高ie8也支援 iframe postmessage ,具體的不多說了,詳見我的另一篇文章 localstorage 跨域解決方案,就是採用的這個方案實現跨域

channel messaging api  這個新出的api挺有意思的,和iframe postmessage 類似,這個不過是往埠postmessage,現在採用這個做個demo

shareworker結合 iframe 實現跨標籤頁跨域通訊大功告成

具體**參見github

瀏覽器跨域

前端部分,簡單的封裝乙個promise版的ajax let myajax function headers else xhr.open method,path for let key,value of object.entries headers xhr.send body myajax heade...

瀏覽器跨域

同源策略 同源策略是乙個重要的安全策略,它用於限制乙個origin的文件或者它載入的指令碼如何能與另乙個源的資源進行互動。它能幫助阻隔惡意文件,減少可能被攻擊的媒介。協議 網域名稱 埠號 http伺服器,預設的埠號為80 tcp 木馬executor開放此埠 https securely trans...

瀏覽器跨域解決方案

今天介紹乙個實用的瀏覽器跨域方案。比如 a 嵌入了 b 的頁面,這時 b 的頁面想要呼叫 a 的頁面的方法,因為網域名稱不同,由於瀏覽器同源策略的限制會被 blocked 掉的。以下給出乙個方法 在 a 的寫下 window.addeventlistener message function obj...