返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript 如何实现同源通信
  • 255
分享到

JavaScript 如何实现同源通信

2024-04-02 19:04:59 255人浏览 薄情痞子
摘要

目录一、Broadcast Channel api 简介二、Broadcast Channel API 应用场景2.1 实现同源页面间数据同步2.2 在其它 Tab 页面中监测用户操

一、Broadcast Channel API 简介

Broadcast Channel API 可以实现同源下浏览器不同窗口、Tab 页或者 iframe 下的浏览器上下文之间的简单通讯。通过创建一个监听某个频道下的 BroadcastChannel 对象,你可以接收发送给该频道的所有消息。

(图片来源 —— 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 等对象。另外,需要注意的是,在实际项目中,我们还要考虑它的兼容性:

(图片来源 —— 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 元素的内容将会自动实现同步更新。

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 API
BroadcastChannel API: A Message Bus for the Web

以上就是javascript 如何实现同源通信的详细内容,更多关于JavaScript 同源通信的资料请关注编程网其它相关文章!

--结束END--

本文标题: JavaScript 如何实现同源通信

本文链接: https://lsjlt.com/news/125845.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript 如何实现同源通信
    目录一、Broadcast Channel API 简介二、Broadcast Channel API 应用场景2.1 实现同源页面间数据同步2.2 在其它 Tab 页面中监测用户操...
    99+
    2024-04-02
  • JavaScript怎么实现同源通信
    这篇文章将为大家详细讲解有关JavaScript怎么实现同源通信,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Broadcast Channel API 简介Broadcast Channel API...
    99+
    2023-06-15
  • JavaScript和Go:如何实现实时通信?
    实时通信已经成为了现代Web应用程序的关键特性之一。它使得用户能够在不刷新页面的情况下实时接收来自服务器的更新,从而提高了用户体验。这种通信可以使用多种技术来实现,其中JavaScript和Go是两种最常用的技术之一。 在这篇文章中,我们...
    99+
    2023-08-17
    http javascript 实时
  • 你知道如何在PHP和JavaScript之间实现同步通信吗?
    PHP和JavaScript是开发Web应用程序最常用的两种编程语言。它们分别用于服务器端和客户端编程,并且在Web开发中起着至关重要的作用。然而,对于许多开发人员来说,如何在PHP和JavaScript之间进行同步通信仍然是一个挑战。在本...
    99+
    2023-08-13
    同步 实时 javascript
  • redis不同实例如何通信
    redis 实例间通信有多种机制:pub/sub:发布/订阅模式,允许高效、低延迟的消息传递。cluster 模式:分布式部署方式,提供高可用性和容错性。cross-instance c...
    99+
    2024-06-12
    redis 分布式部署
  • Flex如何实现通信
    这篇文章主要介绍了Flex如何实现通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex通信方法Flex通常作为一个web项目的一部分嵌入到一个web页中,因此Flex程...
    99+
    2023-06-17
  • Python实现进程同步和通信
    引例: 如之前创建多进程的例子 # -*- coding:utf-8 -*- from multiprocessing import Process,Pool import os,time def run_proc(name):...
    99+
    2023-01-31
    进程 通信 Python
  • python和JavaScript通信怎么实现
    本文小编为大家详细介绍“python和JavaScript通信怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“python和JavaScript通信怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。j...
    99+
    2023-06-30
  • javascript能实现远程通信吗
    JavaScript是一种客户端脚本语言,一般是嵌入在HTML文件中的,它在浏览器端运行,与服务器端进行远程通信需要借助一些技术手段。在本文中,我们将探讨JavaScript如何实现远程通信。一、AJAX技术AJAX是异步JavaScrip...
    99+
    2023-05-14
  • javascript怎么实现远程通信
    这篇文章主要介绍“javascript怎么实现远程通信”,在日常操作中,相信很多人在javascript怎么实现远程通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript怎么实现远程通信”的疑...
    99+
    2023-07-06
  • VB.NET如何实现通信程序
    这篇文章主要为大家展示了“VB.NET如何实现通信程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET如何实现通信程序”这篇文章吧。1 mscomm.vbx通信控件描述 mscomm....
    99+
    2023-06-17
  • QT如何实现串口通信
    小编给大家分享一下QT如何实现串口通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用...
    99+
    2023-06-15
  • vue如何实现组件通信
    这篇文章主要介绍vue如何实现组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在vue中, 组件的关系不外乎以下三种:组件是需要通信的,在开发中,常用到的通信方式有:vuex、eventBus、以及prop...
    99+
    2023-06-29
  • C#如何实现串口通信
    这篇文章主要讲解了“C#如何实现串口通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现串口通信”吧!1.基本概念2.前端winForm布局如下(仅仅为了实现功能,布局略丑)3.代...
    99+
    2023-06-29
  • C++如何实现即时通信
    本篇内容主要讲解“C++如何实现即时通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++如何实现即时通信”吧!软件:VS服务器端//TcpServer_plus.exe#include<...
    99+
    2023-06-30
  • WCF如何实现双向通信
    这篇文章主要介绍“WCF如何实现双向通信”,在日常操作中,相信很多人在WCF如何实现双向通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”WCF如何实现双向通信”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • 如何进行TCP通信实现
    本篇文章给大家分享的是有关如何进行TCP通信实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。TCP是底层通讯协议,定义的是数据传输和连接方式的规范。TCP协议,传输控制协议(...
    99+
    2023-06-05
  • Java如何实现线程通信
    今天小编给大家分享一下Java如何实现线程通信的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是线程通信、如何实现所谓线程...
    99+
    2023-06-30
  • node中如何实现RPC通信
    本篇内容主要讲解“node中如何实现RPC通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node中如何实现RPC通信”吧!什么是RPC?RPC:Remote Procedure Call(远...
    99+
    2023-07-04
  • React组件通信如何实现
    这篇文章主要介绍“React组件通信如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React组件通信如何实现”文章能帮助大家解决问题。1. 父子组件通信方式父子组件之间的通信很常见,其中父组...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作