最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中實現(xiàn)跨標簽頁通信的方法詳解

 更新時間:2023年11月18日 10:22:46   作者:小不點灬  
跨標簽頁通信是指在瀏覽器中的不同標簽頁之間進行數(shù)據(jù)傳遞和通信的過程,這篇文章為大家介紹了一下常見的跨標簽頁通信方式,感興趣的小伙伴可以了解下

1.Broadcast Channel API(主流推薦)

Broadcast Channel API 允許不同標簽頁之間進行實時通信,而無需使用定時器輪詢。你可以創(chuàng)建一個共享的 Broadcast Channel,并在標簽頁之間發(fā)送消息。這樣,當其他標簽頁接收到消息時,可以立即作出響應(yīng)。Broadcast Channel API 提供了更可靠和高效的跨標簽頁通信方式,避免了不必要的輪詢和性能開銷。

首先我們先創(chuàng)建一個文件crossTagMsg

const channel = new BroadcastChannel('sync-update')


export function sendMsg(type: any, content: any) {
    channel.postMessage({
        type,
        content
    });
}    

export function listenMsg(callback: (arg0: any) => any) {
    const handler = (e: { data: any; }) => {
        callback&&callback(e.data);
    }
    channel.addEventListener('message',handler)
    return ()=>{
        channel.removeEventListener('message', handler) 
    }
}

很簡單的兩行代碼,一個發(fā)送,一個監(jiān)聽,監(jiān)聽返回一個移除函數(shù)

在頁面中引用函數(shù)就可以了

import {listenMsg,sendMsg} from '@/utils/crossTagMsg'

const send = ()=>{
    sendMsg('send',{name:'send'})
}

const unmountedListenMsg = listenMsg((info:any)=>{
    console.log(info.content)
})

onUnmounted(unmountedListenMsg)

2.window.postMessage()

window.postMessage()方法允許在不同的標簽頁之間進行跨域通信,并且是一種安全的方式來實現(xiàn)跨標簽頁通信。下面是使用 window.postMessage() 進行跨標簽頁通信的基本步驟:

在發(fā)送消息的標簽頁(發(fā)送方):

// 發(fā)送消息到目標標簽頁
const targetWindow = window.open('目標標簽頁的URL', '_blank'); // 打開目標標簽頁
targetWindow.postMessage('Hello from sender', '目標標簽頁的源');

// 監(jiān)聽來自目標標簽頁的響應(yīng)消息
window.addEventListener('message', function(event) {
  if (event.source === targetWindow) {
    console.log('Received response:', event.data);
  }
});

在接收消息的標簽頁(接收方):

// 監(jiān)聽來自發(fā)送方標簽頁的消息
window.addEventListener('message', function(event) {
  if (event.origin === '發(fā)送方標簽頁的源') {
    console.log('Received message:', event.data);

    // 發(fā)送響應(yīng)消息給發(fā)送方標簽頁
    event.source.postMessage('Hello from receiver', event.origin);
  }
});

上述代碼中,發(fā)送方標簽頁使用 window.open() 方法打開目標標簽頁,并使用 targetWindow.postMessage() 發(fā)送消息到目標標簽頁。在接收方標簽頁中,使用 window.addEventListener() 監(jiān)聽來自發(fā)送方標簽頁的消息,并在收到消息后發(fā)送響應(yīng)消息。

在 postMessage() 方法中,第一個參數(shù)是要發(fā)送的數(shù)據(jù),可以是字符串、數(shù)字、對象等。第二個參數(shù)是目標窗口的源(origin),用于指定接收方標簽頁的源。這是為了確保只有來自指定源的消息才會被接收和處理,以提供安全性。

需要注意的是,為了確保安全性,需要在通信的兩個標簽頁之間建立信任關(guān)系,即確保目標標簽頁的源是你所期望的,并且不接受來自未知或不信任的源的消息。

通過使用 window.postMessage() 方法,你可以在不同的標簽頁之間進行跨域通信,并傳遞數(shù)據(jù)和消息。這種方式適用于需要在不同標簽頁之間進行實時通信或共享數(shù)據(jù)的場景。

3.visibilitychange

visibilitychange可以監(jiān)聽頁面的狀態(tài),判斷頁面的顯示和隱藏,當頁面顯示的時候可以重新請求最新的數(shù)據(jù)

window.addEventListener('visibilitychange',function(e:any){
    if (document.visibilityState === 'visible') {
        // 頁面顯示
        console.log('頁面顯示');
        // 執(zhí)行頁面顯示時的操作 更新數(shù)據(jù)
    } else if (document.visibilityState === 'hidden') {
        // 頁面隱藏
        console.log('頁面隱藏');
        // 執(zhí)行頁面隱藏時的操作
    }
})

4.Server-Sent Events(SSE)

Server-Sent Events(SSE)是一種用于在客戶端和服務(wù)器之間實現(xiàn)實時單向通信的技術(shù)。它允許服務(wù)器向客戶端推送數(shù)據(jù),而無需客戶端發(fā)送請求。

SSE 基于 HTTP 協(xié)議,使用了長輪詢(Long Polling)的機制??蛻舳送ㄟ^向服務(wù)器發(fā)送一個 HTTP 請求,該請求保持打開狀態(tài),直到服務(wù)器有新的數(shù)據(jù)可用或連接超時。當服務(wù)器有新數(shù)據(jù)時,它會將數(shù)據(jù)作為一個持久連接的響應(yīng)發(fā)送給客戶端。

使用 SSE 的關(guān)鍵是服務(wù)器端需要發(fā)送特殊格式的數(shù)據(jù),遵循 SSE 的規(guī)范。服務(wù)器發(fā)送的數(shù)據(jù)被組織為一系列的事件(events),每個事件具有一個事件類型和數(shù)據(jù)字段??蛻舳送ㄟ^監(jiān)聽相應(yīng)的事件類型來處理接收到的數(shù)據(jù)。

下面是一個使用 SSE 的示例:

服務(wù)器端代碼(Node.js):

const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
  });

  // 發(fā)送事件及數(shù)據(jù)到客戶端
  res.write('event: message\n');
  res.write('data: Hello, world!\n\n');

  // 模擬每秒鐘發(fā)送一個事件
  setInterval(() => {
    res.write('event: message\n');
    res.write(`data: Current time is ${new Date().toLocaleTimeString()}\n\n`);
  }, 1000);
}).listen(3000);

客戶端代碼(JavaScript):

const eventSource = new EventSource('/stream');

eventSource.addEventListener('message', (event) => {
  const data = event.data;
  console.log('Received message:', data);
});

在上述示例中,服務(wù)器創(chuàng)建了一個 HTTP 服務(wù)器,當客戶端向 /stream 路徑發(fā)出請求時,服務(wù)器會將響應(yīng)的 Content-Type 設(shè)置為 text/event-stream,表示這是一個 SSE 連接。服務(wù)器通過發(fā)送以 "event" 和 "data" 字段組成的事件響應(yīng),向客戶端推送數(shù)據(jù)。

客戶端使用 EventSource 對象來建立 SSE 連接,并通過事件監(jiān)聽器來處理接收到的事件。在上述示例中,客戶端監(jiān)聽了 message 事件,并在事件發(fā)生時將數(shù)據(jù)打印到控制臺。

SSE 提供了一種簡單而有效的方式來實現(xiàn)服務(wù)器向客戶端的實時數(shù)據(jù)推送,適用于需要實時更新數(shù)據(jù)的應(yīng)用程序,如聊天應(yīng)用、實時通知、股票報價等。它相對于傳統(tǒng)的輪詢方式具有更低的延遲和更高的效率。

到此這篇關(guān)于JavaScript中實現(xiàn)跨標簽頁通信的方法詳解的文章就介紹到這了,更多相關(guān)JavaScript跨標簽頁通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 理解Javascript閉包

    理解Javascript閉包

    閉包是ECMAScript一個很重要的特征,但是卻很難用合適的定義來描述它。雖然閉包很難清晰地描述,但是,卻很容易創(chuàng)建,或者說,不小心創(chuàng)建。然而,閉包的存在其實是有一定的潛在問題的。為了避免“不小心”地創(chuàng)建閉包,以及更好地利用閉包的優(yōu)點,有必要理解閉包的機制
    2013-11-11
  • 微信小程序配置視圖層數(shù)據(jù)綁定相關(guān)示例

    微信小程序配置視圖層數(shù)據(jù)綁定相關(guān)示例

    這篇文章主要為大家介紹了微信小程序配置視圖層數(shù)據(jù)綁定相關(guān)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪<BR>
    2022-04-04
  • JSON遍歷方式實例總結(jié)

    JSON遍歷方式實例總結(jié)

    這篇文章主要介紹了JSON遍歷方式,結(jié)合實例形式總結(jié)分析了JavaScript操作json實現(xiàn)遍歷的常用技巧,并給出了實例總結(jié),需要的朋友可以參考下
    2015-12-12
  • node.js chat程序如何實現(xiàn)Ajax long-polling長鏈接刷新模式

    node.js chat程序如何實現(xiàn)Ajax long-polling長鏈接刷新模式

    node.js chat是node.js作者用JS寫的一個多人聊天工具, 源代碼公開下載,網(wǎng)址是chat.nodejs.org。作者用這個小例子,來展示如何用nodejs開發(fā)高效率的應(yīng)用程序。對于nodejs的學(xué)習(xí)者來說,是一個很好的例子
    2012-03-03
  • 動態(tài)的創(chuàng)建一個元素createElement及刪除一個元素

    動態(tài)的創(chuàng)建一個元素createElement及刪除一個元素

    本文用示例為大家介紹下動態(tài)創(chuàng)建一個元素createElement及刪除一個元素,感興趣的朋友可以參考下
    2014-01-01
  • JS面向?qū)ο缶幊袒A(chǔ)篇(三) 繼承操作實例詳解

    JS面向?qū)ο缶幊袒A(chǔ)篇(三) 繼承操作實例詳解

    這篇文章主要介紹了JS面向?qū)ο缶幊汤^承操作,結(jié)合實例形式詳細分析了JS面向?qū)ο罄^承的具體概念、原理、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下
    2020-03-03
  • 小程序ios音頻播放沒聲音問題的解決

    小程序ios音頻播放沒聲音問題的解決

    這篇文章主要介紹了小程序ios音頻播放沒聲音問題的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • javascript獲取web應(yīng)用根目錄的方法

    javascript獲取web應(yīng)用根目錄的方法

    這篇文章主要介紹了javascript獲取web應(yīng)用根目錄的方法,需要的朋友可以參考下
    2014-02-02
  • JS+ACTIVEX實現(xiàn)網(wǎng)頁選擇本地目錄路徑對話框

    JS+ACTIVEX實現(xiàn)網(wǎng)頁選擇本地目錄路徑對話框

    使用ACTIVEX對象遍歷本地磁盤和目錄,只需網(wǎng)頁啟用相關(guān)ACTIVEX的INTERNET選項即可實現(xiàn)路徑選擇對話框,感興趣的你可以參考下哈希望可以幫助到你
    2013-03-03
  • 用Javascript來生成ftp腳本的小例子

    用Javascript來生成ftp腳本的小例子

    昨天閑著沒事,又因為工作需要,寫了一個腳本,用來做ftp。當然不是直接做ftp,而是產(chǎn)生一個ftp的腳本,供ftp命令使用。
    2013-07-07

最新評論

肇源县| 寻乌县| 玉树县| 桂阳县| 彭阳县| 通海县| 宕昌县| 新绛县| 清水河县| 湖南省| 裕民县| 师宗县| 澄江县| 黄石市| 金门县| 安新县| 厦门市| 海晏县| 永康市| 林口县| 墨玉县| 永泰县| 庆阳市| 洛宁县| 疏附县| 五大连池市| 阳高县| 泸溪县| 新田县| 青铜峡市| 上高县| 谢通门县| 泾川县| 甘洛县| 江城| 漳州市| 吐鲁番市| 潼南县| 乌什县| 隆化县| 漳平市|