需求:A页面中要嵌入一个iframe,这个iframe是B页面,此时A页面需要得到B页面的一些信息。

window.postMessage()

我们都知道浏览器的同源策略,即对于两个不同页面的脚本,只有当他们的页面具有相同的协议,端口号和主机(document.domain)时,两个脚本才能互相通信。

window.postMessage()方法规避了此限制,只要正确使用,这种方法就很安全。

重点:window.postMessage中的window始终是你要通信的目标页面的window。

用法

window.postMessage(message, targetPage, [transfer]);

  • message: 要传递的data
  • targetPage:你要发送信息的目标域名。*表示所有域名。
  • transfer:可选参数。是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

案例

如果B页面需要向A页面传递message的话,在B页面使用window.postMessage方法向A页面传递message。

top.postMessage('This is page B!', pageA域名);

window.postMessage中的window始终是你要通信的目标页面的window,而这里A页面才是通信的目标页面,所以需要用top。

而在A页面需要监听"message"事件来获取B页面传递过来的message。

window.addEventListener('message', this.receiveMessage, false);
receiveMessage = (event) => {
console.log(event.data);
}

event的属性有:

  • data:从页面B传过来的message
  • origin:页面B的origin
  • source:页面B的引用

如果A页面需要向B页面传递信息呢?

// Page A
// window为pageB页面的window,即iframe.contentWindow
document.getElementByID('iframe').contentWindow.postMessage(msg, pageB域名);
// Page B
window.addEventListener('message', this.receiveMessage, false);
receiveMessage = (event) => {
console.log(event.data);
}

参考:https://blog.csdn.net/weixin_42420703/article/details/98229993

iframe跨域通信window.postMessage()方法的更多相关文章

  1. 跨域通信--Window.postMessage()

    一.跨源通信概述 源:协议.端口号(https默认值433).主机域名(document.domain) 作用:向目标窗口派发MessageEvent消息(四个属性) 兼容参考 MessageEven ...

  2. iframe跨域通信实战

    "长时间不写文章,开头的方式总是那么出奇的相似",最近很忙,好久没写博客了啊(是不是?). 更换工作已经有三个月有余,这段三个月把过去三年没加过的班都加了一次.收获挺多,发现的问题 ...

  3. JavaScript 跨域:window.postMessage 实现跨域通信

    JavaScript 跨域方式实现方式有很多,之前,一篇文章中提到了 JSONP 形式实现跨域.本文将介绍 HTML5 新增的 api 实现跨域:window.postMessage . 1 othe ...

  4. Javascript使用postMessage对iframe跨域通信

    今天才发现原来有这么个好东西啊,跨域通信太方便了, 举个小栗子: 共两个页面, 页面1:www.a.com/a.html 页面2:www.b.com/b.html 实现目标:两个网站页面实现跨域相互通 ...

  5. iframe跨域通信方案

    概述 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首先什么 ...

  6. 对iframe跨域通信的封装

    github源码:https://github.com/boycy815/topProxy 为了偷懒所以依赖了Kissy:http://docs.kissyui.com/ 用法举例:需求是在http: ...

  7. iframe 跨域调用父级方法的方案

    一.如果高层域名相同的话,可以通过document.domain来实现跨域访问 例如: 父级域名:localhost:8080 子级域名:localhost:9090 那么可以设置document.d ...

  8. JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  9. 跨域问题及其解决方法(JSONP&CORS)

    一.什么是跨域 当a.qq.com域名下的页⾯或脚本试图去请求b.qq.com域名下的资源时,就是典型的跨域行为.跨域的定义从受限范围可以分为两种,⼴义跨域和狭义跨域. (一)广义跨域 ⼴义跨域通常包 ...

  10. 使用window.postMessage实现跨域通信

    JavaScript由于同源策略的限制,跨域通信一直是棘手的问题.当然解决方案也有很多: document.domain+iframe的设置,应用于主域相同而子域不同: 利用iframe和locati ...

随机推荐

  1. idea集成maven插件 使用骨架创建maven的java工具 不使用骨架创建maven的java工程

    idea集成maven插件   使用骨架创建maven的java工具  new-->FIle-->Model 选择Maven对勾选上要不不能使用骨架 找到这个,选上下一步 Finish即可 ...

  2. golang json化时允许赋予默认值

    演示omitempty 代码: package main import ( "encoding/json" "fmt" ) func main() { type ...

  3. react 非父子组件传参方式

    1.通过父组件当中间人方式,子传父再传子 2.通过发布订阅模式 obj={ list:[], sub(callback){ list.push(callback) }, pub(){ list.for ...

  4. aspose word导出表格

    [HttpGet] [Route("GetPurchaseItemWord")] public IHttpActionResult Get_PurchaseItemWord(str ...

  5. ssr next 学习记录

    预加载页面   只有生产环境才有 当页面初始化加载时,getInitialProps只会加载在服务端.只有当路由跳转(Link组件跳转或 API 方法跳转)时,客户端才会执行getInitialPro ...

  6. 物联网之Wifi协议

    今天来重点介绍一下WIfi协议,咱们用的其实已经很多了. 主要内容: ⼀.基本概述 ⼆.实践基础 三.⼀些原理 ⼀.基本概述 ============================ 1.有线和⽆线⽹ ...

  7. java jdk8安装之后java -version失败

    将此目录下的(C:\Program Files (x86)\Common Files\Oracle\Java\javapath_target_86850671)三个.exe文件删除即可!

  8. Luogu P3368 【模板】树状数组 2 [区间修改-单点查询]

    P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表 ...

  9. find_in_set使用:匹配按逗号分隔后的内容

    SELECT  * FROM `tb_test` WHERE c_id ='123' AND create_time LIKE '2021-06-03%'  AND find_in_set('A362 ...

  10. Executor框架详解

    Executor框架详解 java的线程既是工作单元,也是执行机制.从jdk5开始,把工作单元与执行机制分离开来.工作单元包括Runnable和Callable,而执行机制由Executor框架提供. ...