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

假如一個需求需要A頁和B頁C頁等進行相互通信,並且有第三個頁打開時,接收之前的最後一條消息或是全部的歷史消息,如何優雅的實現呢?

【跨標籤頁通信方案】

  1. 通過監聽storage 事件
  2. 通過ShareWorker
  3. 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 通信的手段有

  1. PostMessage 父子頁通過postMessage 來通信,這個方案兼容性極高IE8也支持 iframe PostMessage ,具體的不多說了,詳見我的另一篇文章 localStorage 跨域解決方案,就是採用的這個方案實現跨域
  2. Channel Messaging API  這個新出的api挺有意思的,和iframe postMessage 類似,這個不過是往端口postMessage,現在採用這個做個demo

ShareWorker結合 iframe 實現跨標籤頁跨域通信大功告成

具體代碼參見github https://github.com/yyccmmkk/JS-browser-tab-bridge

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章