JavaScript之页面与iframe的通讯

我们想实现页面与iframe的通讯,可以使用Channel Messaging API

Channel Messaging API 允许两个不同的脚本运行在同一个文档的不同浏览器上下文(比如两个 iframe,或者文档主体和一个 iframe,使用 SharedWorker 的两个文档,或者两个 worker)来直接通讯,在每端使用一个端口(port)通过双向频道(channel)向彼此传递消息。

Channel 通信的概念和用法

使用 MessageChannel() 构造函数来创建通讯信道。一旦创建,信道的两个端口即可通过 MessageChannel.port1 和 MessageChannel.port2 属性进行访问(都会返回 MessagePort 对象)。创建信道的应用程序使用 port1,在另一端的程序使用 port2 —— 你向 port2 发送信息,然后携带 2 个参数(需要传递的消息,要传递所有权的对象,在这里是 port 自身)调用 window.postMessage 方法将端口信息传递到另一个浏览器上下文。

当这些可传递的对象被传递后,他们就从之前所属的上下文中消失了。比如一个 port,一旦被发送,在原本的上下文中就再也不可用了。注意当前仅有 ArrayBuffer 和 MessagePort 对象可以被发送。

另一个浏览器上下文可以使用 MessagePort.onmessage 监听信息,并使用事件的 data 属性获取消息内容。你可以通过 MessagePort.postMessage 向原来的文档发送应答消息。

当你想要停止通过信道发送消息时,你可以调用来关闭 MessagePort.close 端口。

比如,主页面:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width">
    <title>Channel messaging demo</title>
    <link rel="stylesheet" href="">
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>Channel messaging demo</h1>
    <p class="output">My body</p>
    <iframe src="page2.html" width='480' height='320'></iframe>
  </body>
  <script>
    var channel = new MessageChannel();
    var output = document.querySelector('.output');
    var iframe = document.querySelector('iframe');

    // Wait for the iframe to load
    iframe.addEventListener("load", onLoad);
    
    function onLoad() {
      // Listen for messages on port1
      channel.port1.onmessage = onMessage;
      // Transfer port2 to the iframe
      iframe.contentWindow.postMessage('Hello from the main page!', '*', [channel.port2]);
    }

    // Handle messages received on port1
    function onMessage(e) {
      output.innerHTML = e.data;
    }
  </script>
</html>

嵌入的iframe:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width">
    <title>My page title</title>
    <link rel="stylesheet" href="">
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
  </head>
  <body>
    <p class="output">iFrame body</p>
  </body>
  <script>
  var output = document.querySelector('.output');

  window.addEventListener('message', onMessage);
  
  function onMessage(e) {
  	output.innerHTML = e.data;
    // Use the transfered port to post a message back to the main frame
  	e.ports[0].postMessage('Message back from the IFrame');
  }
  </script>
</html>

效果图:
在这里插入图片描述

发布了21 篇原创文章 · 获赞 52 · 访问量 5757

猜你喜欢

转载自blog.csdn.net/liuyifeng0000/article/details/104073572