JavaScript iframe 实现多窗口通信实例详解

yizhihongxing

JavaScript iframe 实现多窗口通信实例详解

当我们在一个页面中嵌入多个 iframe 元素时,它们之间的通信就变得比较复杂。但是,我们可以使用 JavaScript 来实现 iframe 之间的通信。在本文中,我们将深入讨论如何使用 JavaScript,通过 iframe 实现多窗口通信的过程和相关的示例代码。

iframe 与 JavaScript

iframe 元素允许我们在当前页面中嵌入另一个页面,通过它可以方便地实现一些功能,比如异步加载、多页面容器等。但是,由于涉及到跨域的问题,iframe 之间的通信有时比较困难,这时候就需要使用 JavaScript 来实现。

实现过程

父窗口向子窗口通信

如果我们想在当前页面中的一个 iframe 中向另一个 iframe 发送消息,可以通过以下步骤实现:

  1. 获取子 iframe 元素对象:

javascript
const iframe = document.getElementById("iframe");

  1. 使用 contentWindow 属性获取子窗口对象:

javascript
const childWindow = iframe.contentWindow;

  1. 向子窗口发送消息:

javascript
childWindow.postMessage("Hello child window!", "http://localhost:8080");

postMessage 方法的第一个参数为传递的消息内容,第二个参数为可选项,用于指定接收消息的窗口地址。如果要限制发送消息的窗口地址,可以使用 targetOrigin 参数。

注意:在发送消息的同时,需要指定接收消息的窗口地址,这可以避免恶意窗口向其他页面发送消息。

  1. 子窗口接收消息:

在发送消息的同时,我们还需要在子窗口中监听并接收父窗口发送的消息,可以通过以下代码实现:

javascript
window.addEventListener("message", (event) => {
if (event.origin !== "http://localhost:3000") {
console.log(`Received message from parent window: ${event.data}`);
}
});

message 事件会在收到消息时触发,通过判断 event.origin,可以避免接收来自不被信任的窗口发送的消息。

子窗口向父窗口通信

如果我们想在子窗口中向父窗口发送消息,也可以通过类似的方式实现:

  1. 获取父窗口对象:

javascript
const parentWindow = window.parent;

  1. 向父窗口发送消息:

javascript
parentWindow.postMessage("Hello parent window!", "http://localhost:3000");

  1. 父窗口接收消息:

在父窗口中监听子窗口发送的消息,可以通过以下代码实现:

javascript
window.addEventListener("message", (event) => {
if (event.origin === "http://localhost:8080") {
console.log(`Received message from child window: ${event.data}`);
}
});

同样需要判断接收消息的窗口地址,避免接收来自不被信任的窗口发送的消息。

示范代码

以下两个示例说明了如何使用 JavaScript 实现 iframe 之间的通信:

父窗口向子窗口通信示例

<!-- parent.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>Parent Window</title>
  </head>
  <body>
    <h1>Parent Window</h1>
    <iframe id="child" src="child.html"></iframe>
    <script>
      const iframe = document.getElementById("child");
      const childWindow = iframe.contentWindow;
      childWindow.postMessage("Hello child window!", "http://localhost:8080");

      window.addEventListener("message", (event) => {
        if (event.origin !== "http://localhost:3000") {
          console.log(`Received message from child window: ${event.data}`);
        }
      });
    </script>
  </body>
</html>

<!-- child.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>Child Window</title>
  </head>
  <body>
    <h1>Child Window</h1>
    <script>
      window.addEventListener("message", (event) => {
        if (event.origin !== "http://localhost:8080") {
          console.log(`Received message from parent window: ${event.data}`);
        }
      });
    </script>
  </body>
</html>

在上面的代码中,父窗口页面中嵌入了 child.html 页面,然后父窗口向子窗口发送消息,子窗口接收消息并输出到控制台中,父窗口也接收子窗口发送的消息,同样输出到控制台中。

子窗口向父窗口通信示例

<!-- parent.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>Parent Window</title>
  </head>
  <body>
    <h1>Parent Window</h1>
    <iframe id="child" src="child.html"></iframe>
    <script>
      window.addEventListener("message", (event) => {
        if (event.origin === "http://localhost:8080") {
          console.log(`Received message from child window: ${event.data}`);
        }
      });
    </script>
  </body>
</html>

<!-- child.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>Child Window</title>
  </head>
  <body>
    <h1>Child Window</h1>
    <button onclick="sendMessage()">Send Message to Parent</button>
    <script>
      function sendMessage() {
        const parentWindow = window.parent;
        parentWindow.postMessage("Hello parent window!", "http://localhost:3000");
      }
    </script>
  </body>
</html>

在上面的代码中,子窗口中包含一个按钮,当用户点击按钮时,子窗口会向父窗口发送消息,并输出到控制台中,父窗口也接收到子窗口的消息,同样输出到控制台中。

总结

在本文中,我们通过示例代码详细讲解了如何使用 JavaScript 实现 iframe 之间的通信,包括父窗口向子窗口通信以及子窗口向父窗口通信两种场景。希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript iframe 实现多窗口通信实例详解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 教你30秒发布一个TypeScript包到NPM的方法步骤

    创建 NPM 账号 首先,你需要在 NPM 官网注册一个账号。注册账号很简单,只需要填写几个基本信息即可。若你已有账号,请跳过此步。 初始化工程 创建工程文件夹,进入此文件夹,初始化工程: npm init (在终端输入该命令后,按照提示输入参数) 安装 TypeScript 在终端输入以下命令: npm install typescript –save-…

    node js 2023年6月9日
    00
  • Node之简单的前后端交互(实例讲解)

    首先回顾一下这篇文章的主要内容。它主要是讲解如何使用Node.js实现前后端交互的过程,具体内容包括: 开启本地服务器,使用Node.js实现对于前端页面的请求响应 在前端页面中使用ajax发送请求,获取后端服务器响应数据 使用ejs模板引擎渲染动态页面 下面我们分别来详细介绍这三部分内容。 开启本地服务器 我们在Node.js中使用http模块创建一个本地…

    node js 2023年6月8日
    00
  • node.js中的fs.unlinkSync方法使用说明

    下面是详细的攻略: Node.js中的fs.unlinkSync方法使用说明 简介 在Node.js中,fs.unlinkSync方法用于同步删除指定的文件。该方法会立即删除指定的文件,如果文件不存在,则会抛出异常。 该方法属于fs模块中的一个同步方法,用于对文件进行操作。在使用该方法时需要特别注意,因为在同步模式下,如果该方法执行的时间过长,则会阻塞整个N…

    node js 2023年6月8日
    00
  • 使用koa2创建web项目的方法步骤

    使用koa2创建web项目的方法步骤可以分为以下几步: 步骤一:安装Node.js 首先需要安装Node.js,可以在官网下载:https://nodejs.org/zh-cn/ 步骤二:安装koa2 安装koa2可以使用npm进行安装,在命令行中输入以下命令: npm install koa 步骤三:创建一个koa2项目 在命令行中输入以下命令,创建一个空…

    node js 2023年6月8日
    00
  • Node.js中http模块和导出共享问题

    在Node.js中,http模块是非常重要的一个模块,用于创建HTTP服务器和HTTP客户端。同时,在Node.js中,我们经常会使用模块化的方式来组织代码,将大型程序分解成较小的模块,方便维护和开发。但是,在使用http模块创建服务器时,我们经常会遇到导出共享问题,这个问题可能会导致难以发现的bug,因此需要注意处理。本文将详细讲解Node.js中http…

    node js 2023年6月8日
    00
  • NodeJS远程代码执行

    NodeJS远程代码执行是指攻击者通过网络将恶意代码传递到目标服务器上,并执行该代码。这种攻击方式往往能够导致服务器系统的完全崩溃或者数据泄露等严重后果,因此需要我们注意和提高防御能力。 下面是远程代码执行的攻击途径和防御措施: 攻击途径 由于网络协议漏洞或脆弱性的存在 通过注入不受信任或者非法内容到网络请求中 通过渗透 web 程序环境中的代码脆弱性,绕过…

    node js 2023年6月8日
    00
  • 详解Node.js中的Async和Await函数

    详解Node.js中的Async和Await函数攻略 前言 在Node.js中异步编程是非常常见的,通常我们使用回调函数、Promise和事件来避免阻塞I/O操作。然而这些编程模式可能导致回调地狱和难以理解的代码。为了解决这个问题,我们可以使用ES7中的Async和Await函数。 Async和Await是ES7提出的一种异步编程方案,它们提供了直接、清晰、…

    node js 2023年6月8日
    00
  • Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析

    下面我将为你详细讲解“Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析”的完整攻略。 一. 概述 本攻略主要介绍了如何使用Vue和Node配合查询MongoDB数据库,以及在页面中传递数据的操作。其中Vue用于前端展示,Node用于后端请求处理,MongoDB用于数据的存储和读取。 二. 准备工作 在开始攻略前,确保本机已经安装了以下环境…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部