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

JavaScript中跨標簽頁通信的常見方式

 更新時間:2023年10月31日 08:30:06   作者:前端俊剛  
跨標簽頁通信是指在瀏覽器中的不同標簽頁之間進行數(shù)據(jù)傳遞和通信的過程,這篇文章為大家整理了幾個常見的跨標簽頁通信方式,感興趣的小伙伴可以了解下

引言

跨標簽頁通信是指在瀏覽器中的不同標簽頁之間進行數(shù)據(jù)傳遞和通信的過程。在傳統(tǒng)的Web開發(fā)中,每個標簽頁都是相互獨立的,無法直接共享數(shù)據(jù)。然而,有時候我們需要在不同的標簽頁之間進行數(shù)據(jù)共享或者實現(xiàn)一些協(xié)同操作,這就需要使用跨標簽頁通信來實現(xiàn)。

常見的跨標簽頁方案

  • BroadCast Channel
  • Service Worker
  • LocalStorage window.onstorage 監(jiān)聽
  • window.open、window.postMessage
  • Shared Worker 定時器輪詢( setInterval )
  • IndexedDB 定時器輪詢( setInterval )
  • cookie 定時器輪詢( setInterval )
  • Websocket

前面4種方式可見: 跨標簽頁通信的8種方式(上)

本文介紹后面4種

Shared Worker

Shared Worker 是一種在多個瀏覽器標簽頁之間共享的 JavaScript 線程。它可以用于實現(xiàn)跨標簽頁的通信。

SharedWorker 接口代表一種特定類型的 worker,可以從幾個瀏覽上下文中訪問,例如幾個窗口、iframe 或其他 worker。它們實現(xiàn)一個不同于普通 worker 的接口,具有不同的全局作用域,

備注:  如果要使 SharedWorker 連接到多個不同的頁面,這些頁面必須是同源的(相同的協(xié)議、host 以及端口)。

兼容性

下面是一個使用 Shared Worker 進行通信的示例:

在主頁面中:

// 創(chuàng)建一個 Shared Worker
const worker = new SharedWorker('worker.js');

// 監(jiān)聽來自 Shared Worker 的消息
worker.port.onmessage = function(event) {
  console.log('Received message from worker:', event.data);
};

// 向 Shared Worker 發(fā)送消息
worker.port.postMessage('Hello from main page!');

在 worker.js 文件中:

// 監(jiān)聽來自主頁面的消息
self.onconnect = function(event) {
  const port = event.ports[0];
  
  // 監(jiān)聽來自主頁面的消息
  port.onmessage = function(event) {
    console.log('Received message from main page:', event.data);
    
    // 向主頁面發(fā)送消息
    port.postMessage('Hello from shared worker!');
  };
};

IndexedDB

IndexedDB 是一種底層 API,用于在客戶端存儲大量的結(jié)構(gòu)化數(shù)據(jù)(也包括文件/二進制大型對象(blobs))。該 API 使用索引實現(xiàn)對數(shù)據(jù)的高性能搜索。雖然 Web Storage 在存儲較少量的數(shù)據(jù)很有用,但對于存儲更大量的結(jié)構(gòu)化數(shù)據(jù)來說力不從心。而 IndexedDB 提供了這種場景的解決方案。

IndexedDB 是一個事務型數(shù)據(jù)庫系統(tǒng),類似于基于 SQL 的 RDBMS。然而,不像 RDBMS 使用固定列表,IndexedDB 是一個基于 JavaScript 的面向?qū)ο髷?shù)據(jù)庫。IndexedDB 允許你存儲和檢索用索引的對象;可以存儲結(jié)構(gòu)化克隆算法支持的任何對象。你只需要指定數(shù)據(jù)庫模式,打開與數(shù)據(jù)庫的連接,然后檢索和更新一系列事務。

使用 IndexedDB 執(zhí)行的操作是異步執(zhí)行的,以免阻塞應用程序。

IndexedDB 是瀏覽器提供的一種本地數(shù)據(jù)庫,可以用于在多個標簽頁之間共享數(shù)據(jù)。可以使用 setInterval 定時輪詢 IndexedDB 來實現(xiàn)跨標簽頁通信。下面是一個示例:

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

// 打開或創(chuàng)建 IndexedDB 數(shù)據(jù)庫
const request = indexedDB.open('messageDatabase', 1);

request.onupgradeneeded = function(event) {
  const db = event.target.result;
  
  // 創(chuàng)建一個對象存儲空間用于存儲消息
  db.createObjectStore('messages', { keyPath: 'id', autoIncrement: true });
};

request.onsuccess = function(event) {
  const db = event.target.result;
  
  // 向數(shù)據(jù)庫中添加一條新消息
  const transaction = db.transaction(['messages'], 'readwrite');
  const objectStore = transaction.objectStore('messages');
  
  const message = { content: 'Hello from sender!' };
  
  objectStore.add(message);
  
  transaction.oncomplete = function() {
    console.log('Message sent successfully!');
    
    // 關(guān)閉數(shù)據(jù)庫連接
    db.close();
  };
};

request.onerror = function(event) {
  console.error('Error opening database:', event.target.error);
};

在接收消息的標簽頁中:

// 打開或創(chuàng)建 IndexedDB 數(shù)據(jù)庫
const request = indexedDB.open('messageDatabase', 1);

request.onsuccess = function(event) {
  const db = event.target.result;
  
  // 創(chuàng)建一個定時器,每隔一段時間輪詢數(shù)據(jù)庫中的消息
  setInterval(function() {
    // 創(chuàng)建一個事務
    const transaction = db.transaction(['messages'], 'readwrite');
    const objectStore = transaction.objectStore('messages');
    
    // 獲取存儲在對象存儲中的所有消息
    const request = objectStore.getAll();
    
    request.onsuccess = function(event) {
      const messages = event.target.result;
      
      // 處理消息
      messages.forEach(function(message) {
        console.log('Received message:', message.content);
        
        // 在處理完消息后,刪除該消息
        objectStore.delete(message.id);
      });
      
      // 關(guān)閉事務
      transaction.oncomplete = function() {
        console.log('Messages processed successfully!');
      };
    };
    
    request.onerror = function(event) {
      console.error('Error retrieving messages:', event.target.error);
      
      // 關(guān)閉事務
      transaction.abort();
    };
  }, 1000);
};

request.onerror = function(event) {
  console.error('Error opening database:', event.target.error);
};

在上述示例中,我們創(chuàng)建了一個名為 "messageDatabase" 的 IndexedDB 數(shù)據(jù)庫,并在其中創(chuàng)建了一個名為 "messages" 的對象存儲空間用于存儲消息。在發(fā)送消息的標簽頁中,我們向數(shù)據(jù)庫中添加一條新消息。而在接收消息的標簽頁中,我們創(chuàng)建了一個定時器,每隔一段時間輪詢數(shù)據(jù)庫中的消息,并處理這些消息。處理完消息后,我們將其從數(shù)據(jù)庫中刪除。

請注意,在實際應用中,您可能需要更復雜的邏輯來處理跨標簽頁通信,并確保數(shù)據(jù)同步和一致性。此示例僅提供了一個基本的框架來演示如何使用 IndexedDB 實現(xiàn)跨標簽頁通信。

cookie

Cookie 是一種在瀏覽器和服務器之間傳遞的小型文本文件,可以用于在多個標簽頁之間共享數(shù)據(jù)??梢允褂?setInterval 定時輪詢 Cookie 來實現(xiàn)跨標簽頁通信。下面是一個示例:

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

// 設置一個 Cookie,將消息存儲在 Cookie 中
document.cookie = 'message=Hello from sender!';

在接收消息的標簽頁中:

// 創(chuàng)建一個定時器,每隔一段時間輪詢 Cookie 中的數(shù)據(jù)
setInterval(function () {
  // 獲取存儲在 Cookie 中的消息
  const cookies = document.cookie.split(';')
  let message = ''

  for (let i = 0; i < cookies.length; i++) {
    const cookie = cookies[i].trim()

    if (cookie.startsWith('message=')) {
      message = cookie.substring('message='.length)
      break
    }
  }

  // 處理消息
  if (message) {
    console.log('Received message:', decodeURIComponent(message))

    // 清除 Cookie
    document.cookie = 'message=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'
  }
}, 1000)

在上述示例中,我們在發(fā)送消息的標簽頁中設置了一個名為 "message" 的 Cookie,并將消息存儲在其中。而在接收消息的標簽頁中,我們創(chuàng)建了一個定時器,每隔一段時間輪詢 Cookie 中的數(shù)據(jù)。通過解析和處理 Cookie,我們可以獲取到存儲的消息,并進行相應的處理。處理完消息后,我們清除了該 Cookie。 請注意,在使用 Cookie 進行跨標簽頁通信時,需要注意以下幾點:

  • 跨域名通信:Cookie 默認只能在同一域名下共享。如果需要在不同域名下進行跨標簽頁通信,需要設置合適的域名和路徑。
  • Cookie 大小限制:Cookie 的大小有限制,通常為幾 KB。如果消息較大,可能需要拆分成多個 Cookie 進行存儲。
  • 安全性考慮:Cookie 中的數(shù)據(jù)可以被用戶和其他腳本訪問和修改。因此,不適合存儲敏感信息。 以上示例提供了一個基本的框架來演示如何使用 Cookie 實現(xiàn)跨標簽頁通信。在實際應用中,您可能需要更復雜的邏輯來處理跨標簽頁通信,并確保數(shù)據(jù)同步和一致性。

websocket

Websocket 是一種在瀏覽器和服務器之間進行全雙工通信的協(xié)議,可以用于實現(xiàn)實時的跨標簽頁通信。下面是一個使用 Websocket 進行通信的示例:

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

// 創(chuàng)建一個 WebSocket 連接
const socket = new WebSocket('ws://example.com');
// 監(jiān)聽連接成功的事件
socket.onopen = function() {
 // 發(fā)送消息到服務器
  socket.send('Hello from sender!');
};

在接收消息的標簽頁中:

// 創(chuàng)建一個 WebSocket 連接
const socket = new WebSocket('ws://example.com');
// 監(jiān)聽來自服務器的消息
socket.onmessage = function(event) {
  console.log('Received message:', event.data);
};

在服務器端:

// 創(chuàng)建一個 WebSocket 服務器
const WebSocketServer = require('ws').Server
const wss = new WebSocketServer({ port: 8080 })
// 監(jiān)聽來自客戶端的連接
wss.on('connection', function (socket) {
  // 監(jiān)聽來自客戶端的消息
  socket.on('message', function (message) {
    console.log('Received message:', message)

    // 向所有客戶端發(fā)送消息
    wss.clients.forEach(function (client) {
      client.send(message)
    })
  })
})

在上述示例中,我們在發(fā)送消息的標簽頁中創(chuàng)建了一個 WebSocket 連接,并在連接成功后發(fā)送一條消息到服務器。而在接收消息的標簽頁中,我們也創(chuàng)建了一個 WebSocket 連接,并監(jiān)聽來自服務器的消息。當服務器收到來自任何客戶端的消息時,它會將該消息廣播給所有連接的客戶端。

總結(jié)

這些通信方式各有優(yōu)劣,選擇適合的方式取決于具體的需求和場景。Shared Worker 和 Websocket 提供了實時性和雙向通信的能力,適用于需要實時更新和交互的應用。IndexedDB 和 Cookie 則適用于需要存儲和同步數(shù)據(jù)的場景,但相對于實時性較差。根據(jù)具體需求,可以選擇合適的通信方式來實現(xiàn)跨標簽頁的通信。

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

相關(guān)文章

  • javascript html5輕松實現(xiàn)拖動功能

    javascript html5輕松實現(xiàn)拖動功能

    這篇文章主要為大家詳細介紹了javascript html5輕松實現(xiàn)拖動功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • JavaScript運動函數(shù)實例詳解

    JavaScript運動函數(shù)實例詳解

    這篇文章主要為大家詳細介紹了JavaScript的運動函數(shù),使用實例在論證,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • javascript使用正則控制input輸入框允許輸入的值方法大全

    javascript使用正則控制input輸入框允許輸入的值方法大全

    在做項目的時候,我們經(jīng)常會遇到控制input輸入框允許輸入的值為數(shù)字,字母,漢字或者混排的情況,那么我們怎么來處理呢,下面我們就來探討怎么通過用javascript正則來實現(xiàn)
    2014-06-06
  • 通過JavaScript實現(xiàn)圖片壓縮

    通過JavaScript實現(xiàn)圖片壓縮

    在學習的時候,有時候看到一些一些網(wǎng)站的圖片是經(jīng)過壓縮處理的,因為壓縮之后的圖片會節(jié)省一部分你的內(nèi)存空間,這樣的話也可以提升性能,于是就比較好奇這是如何實現(xiàn)的,今天我們就簡單的實現(xiàn)一下,需要的朋友可以參考下
    2023-06-06
  • 漂亮的widgets,支持換膚和后期開發(fā)新皮膚(2007-4-27已更新1.7alpha)

    漂亮的widgets,支持換膚和后期開發(fā)新皮膚(2007-4-27已更新1.7alpha)

    漂亮的widgets,支持換膚和后期開發(fā)新皮膚(2007-4-27已更新1.7alpha)...
    2007-04-04
  • Javascript Web Slider 焦點圖示例源碼

    Javascript Web Slider 焦點圖示例源碼

    Slider 焦點圖會在很多的網(wǎng)站上見到,在本文為大家詳細介紹下具體的實現(xiàn)過程,下面的源碼大家可以運行下
    2013-10-10
  • 取鍵盤鍵位ASCII碼的網(wǎng)頁

    取鍵盤鍵位ASCII碼的網(wǎng)頁

    取鍵盤鍵位ASCII碼的網(wǎng)頁...
    2007-07-07
  • 手機瀏覽器喚起微信分享(JS)

    手機瀏覽器喚起微信分享(JS)

    這篇文章主要介紹了手機瀏覽器喚起微信分享功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 數(shù)據(jù)庫管理工具PHPMyAdmin

    數(shù)據(jù)庫管理工具PHPMyAdmin

    這篇文章主要為大家介紹了數(shù)據(jù)庫管理工具PHPMyAdmin使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • JavaScript立即執(zhí)行函數(shù)IIFE的用法詳解

    JavaScript立即執(zhí)行函數(shù)IIFE的用法詳解

    在JavaScript開發(fā)中,立即執(zhí)行函數(shù)(Immediately Invoked Function Expression,簡稱IIFE)是一種非常實用的設計模式,本文將深入探討IIFE的基本概念、作用以及實際應用場景,并通過多個示例幫助開發(fā)者更好地掌握這一技術(shù),需要的朋友可以參考下
    2025-02-02

最新評論

蒙阴县| 永修县| 大港区| 忻州市| 清水河县| 江油市| 临武县| 松原市| 洛阳市| 噶尔县| 开封市| 西林县| 牟定县| 彩票| 阿荣旗| 阳谷县| 琼中| 讷河市| 宝应县| 金湖县| 潼南县| 乳山市| 苏州市| 汾西县| 五莲县| 两当县| 河南省| 酒泉市| 沈丘县| 罗平县| 静海县| 河东区| 元氏县| 方正县| 荔浦县| 宜兴市| 巴塘县| 禄丰县| 临湘市| 弥勒县| 连江县|