hn-failte's blog hn-failte's blog
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hn-failte

前端cv仔
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Webpack

  • React

  • JavaScript

    • new命令原理
    • ES5面向对象
    • ES6面向对象
    • 多种数组去重性能对比
    • JS随机打乱数组
    • 判断是否为移动端浏览器
    • 将一维数组按指定长度转为二维数组
    • 防抖与节流函数
    • JS获取和修改url参数
    • 比typeof运算符更准确的类型判断
    • 三级目录

    • JavaScript

      • JavaScript之函数尾调用与函数尾递归
      • 一种实现call、apply、bind的方法
      • 实现call、apply、bind
      • JavaScript闭包详解
      • 窗口间的通信与iframe跨域
        • iframe 跨域场景
        • postMessage
        • 获取到不同窗口的 window 对象
        • 样例
      • JavaScript逻辑运算符“&&”和“||”短路原则的应用
      • Object原型梳理
      • JavaScript设计模式之发布&订阅模式
      • JavaScript核心:两链一包
      • JavaScript之正则
      • 字符串拼接性能优化
      • JavaScript变量转换
  • Vue

  • 混合开发

  • 学习笔记

  • 微信小程序

  • 前端
  • JavaScript
  • JavaScript
hn-failte
2020-04-21

窗口间的通信与iframe跨域

# 窗口间的通信与 iframe 跨域

# iframe 跨域场景

1、若需要通讯的两个窗口在同源域名下,则无需跨域。

2、若需要通讯的两个窗口在同一个顶级域名下,可以手动配置两个窗口的域名为该顶级域名,从而实现通讯。代码如下:

document.domain = "localhost";
1

3、若需要通讯的两个窗口不在同一顶级域名下,则需要使用到 postMessage 方法。

# postMessage

该方法是 window 下的一个方法,用于发送一条消息。

对应的事件是 onmessage 事件。

const recvMsg = event => {
  if (event.origin === "http://localhost:8080") {
    console.log(event.data);
  }
};
window.onmessage = recvMsg;
// 也可以用事件监听
// window.addEventListener("message", recvMsg)
1
2
3
4
5
6
7
8

该方法可以在其他的窗口中调用,而不会产生跨域问题。(安全通讯)

# 获取到不同窗口的 window 对象

1、若是使用 window.open 打开,则可以通过 window.opener 获取到 window 对象。

2、若是使用 iframe 引用,则可以通过使用 window.top 获取到 window 对象。

# 样例

1、同顶级域名 localhost 域名index.html

<!DOCTYPE html>
<html>
  <body>
    <iframe src="http://localhost:8080/iframe.html" frameborder="0"></iframe>
    <script>
      document.domain = "localhost";
      window.list = [];
      window.setValue = (key, value) => {
        window[key] = value;
      };
      window.getValue = key => {
        return window[key];
      };
    </script>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

localhost:8080 域名iframe.html

<!DOCTYPE html>
<html>
  <body>
    iframe
    <script>
      document.domain = "localhost";
      console.log(top.setValue("list", [1, 2, 3]));
      console.log(top.getValue("list"));
    </script>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11

2、open 形式 localhost 域名index.html

<!DOCTYPE html>
<html>
  <body>
    <script>
      window.open("http://localhost:8080/iframe.html");
      window.onmessage = event => {
        if (event.origin == "http://localhost:8080") {
          console.log(event.origin, event.data);
        }
      };
    </script>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13

localhost:8080 域名iframe.html

<!DOCTYPE html>
<html>
  <body>
    iframe
    <script>
      window.onload = () => {
        window.opener.postMessage("value", "http://localhost");
      };
    </script>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11

3、iframe 形式 localhost 域名index.html

<!DOCTYPE html>
<html>
  <body>
    <iframe src="http://localhost:8080/iframe.html" frameborder="0"></iframe>
    <script>
      window.onmessage = event => {
        if (event.origin == "http://localhost:8080") {
          console.log(event.origin, event.data);
        }
      };
    </script>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13

localhost:8080 域名iframe.html

<!DOCTYPE html>
<html>
  <body>
    iframe
    <script>
      window.onload = () => {
        window.top.postMessage("value", "http://localhost");
      };
    </script>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
编辑 (opens new window)
#iframe#postMessage
上次更新: 2021/08/05, 12:37:41
JavaScript闭包详解
JavaScript逻辑运算符“&&”和“||”短路原则的应用

← JavaScript闭包详解 JavaScript逻辑运算符“&&”和“||”短路原则的应用→

最近更新
01
基于 Taro 的微信小程序优化指南
02-16
02
搭建一个极简混合开发架构
08-03
03
使用State Hook
04-06
更多文章>
Theme by Vdoing | Copyright © 2017-2023 hn-failte | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式