在业务上需要使用iframe嵌入页面的话,很多逻辑和样式需要通过父子页面间的通信来进行调整,本文主要从实践上介绍使用postMessage进行iframe父子页面间的通信
一、postMessage基本语法
otherWindow.postMessage(message, targetOrigin, [transfer]);
-
otherWindow
其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。
-
message
将要发送到其他 window的数据。它将会被结构化克隆算法序列化。这意味着你可以不受什么限制的将数据对象安全的传送给目标窗口而无需自己序列化。
-
targetOrigin
通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串""(表示无限制)或者一个URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。这个机制用来控制消息可以发送到哪些窗口;例如,当用postMessage传送密码时,这个参数就显得尤为重要,必须保证它的值与这条包含密码的信息的预期接受者的orign属性完全一致,来防止密码被恶意的第三方截获。如果你明确的知道消息应该发送到哪个窗口,那么请始终提供一个有确切值的targetOrigin,而不是。不提供确切的目标将导致数据泄露到任何对数据感兴趣的恶意站点。
-
transfer
是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
二、子页面向父页面发消息
通过监听message改变触发回调函数
这里需要注意在组件销毁前需要移除这个监听,否则这个监听会一直存在,每次创建组件都会创建多一次监听
,vue中移除监听要注意每个参数都需要对上,否则会移除失败
-
可实现实时调整iframe高度适配
可以在iframe高度变化时向父页面发送实时高度值,父页面获取消息并实时调整高度
-
可实现父页面路由跳转,面包屑的实时适配
在点击事件中向父页面发送消息,父页面可以在回调函数中设置实现这些需求
三、 父页面向子页面发消息
父页面通过获取iframe标签,设置postMessage方法即可
-
可实现实时获取父窗口滚动条高度,使iframe内的弹窗高度适配