问题:

  1. 如何进行消息通信(父发给子,子接收父的消息,也可父直接调用子的方法; 子发给父,父接收子的消息;)

  2. 如何找到指定的子或者父window(如果iframe层级过多),又如何在发送消息时不影响其他的message监听

一、iframe的使用

<iframe style={{border:0,width:"100%",height:630,}} src={src} />
  1. 如何进行消息通信(父发给子,子接收父的消息; 子发给父,父接收子的消息)

方法一: 直接通过获取父或者子的window来操作 (限制: 必须同域)

// 父调用子的方法:this.iframe.contentWindow.iframe的属性/方法
// 或
document.getElementById("myIframe").contentWindow.iframe的属性/方法// 子调用父的方法:通过parent直接获取父的window
parent.document.的属性/方法

方法二:通过postMessage进行通信(限制: 需要父子约定)

// 父监听子消息:window.addEventListener('message',function(event){...})
// 子发给父消息: 可通过window的属性找到对应的父(这里的parent表示直接上一级的父)
//嵌套一层使用window.top(parent),多层window.frameElement,
//使用top而不是window,top指向iframe最顶层窗口
window.top.postMessage(msg,'父窗口源');
parent.postMessage(data, "*");  // 父给子发消息
document.getElementById("iframe").contentWindow.postMessage(msg,'子窗口源')
iFrame.onload = function(){
//iframe加载完立即发送一条消息
iFrame.contentWindow.postMessage({msg: 'MessageFromIndexPage'},'*');
}
// 子监听父的消息
window.addEventListener("message", (e) => this.listenFunc(e));
  1. 如何找到指定的子或者父window(如果iframe层级过多),又如何在发送消息时不影响其他的message监听
while(true) {// 判断,找到要找的父window,可以通过在父的window上绑定属性来实现if(currentWindow.isParent = true) {  currentWindow.postMessage(data, "*")}if(currentWindow == window.top) {break;  // 防止死循环} else {currentWindow = currentWindwo.parent;}
}
  1. origin是否有用

event.origin 可以获取当前消息的来源路径,通过判断当前iframe的url,判断是否是指定页面的消息来源

二、React Native的WebView和子内容的通信

// RN的WebView
<WebViewref={ref => this.webview = ref}source={{uri: ...}}javaScriptEnabled={true}onMessage={this.handleMassage}allowFileAccess={true}onLoadStart={}onLoadEnd={}
/>
  1. 监听接收web(子)发送的消息
// 接收web发送的消息
handleMessage(event) {const data = JSON.parse(event.nativeEvent.data);const code = data.code;const msg = data.msg;switch(code) {case 0:console.log(msg);break;}
}
  1. web(子)发消息给react native
// web发消息给react native
const data = {code: code, msg: msg};
window.ReactNativeWebView.postMessage(JSON.stringify(data));
  1. React Native(父)发送消息给web(子)
// 发送消息给web
sendMessageToWebView(code, msg) {const data = {code: code, msg: msg};if(this.webview) {this.webview.postMessage(JSON.stringify(data));} else {console.log("no webview ref")}
}
  1. web(子)对React Native(父)消息的监听
// web监听react native的postMessage消息,必须有document, 否则监听不到消息
window.document.addEventListener("message", this.onMessageListener.bind(this));onMessageListener(event) {const data = JSON.parse(event.data);const code = data.code;const msg = data.msg;switch(code) {case ...}
}

三、 android的webview和包含内容的通信(仅做简单介绍)

agentWeb 相对于webview的使用

android 中可以定义当前的window下的名称,

web可以使用 类似window.WebAppInterface.onPostMessage(JSON.stringify(data))来发消息,WebAppInterface需要在Android中定义

综上:

web的iframe之间,web和RN的webview之间,web和android之间的通信,都是使用message进行监听的,需要关注消息来源,否则如果有多个同类型不同类型的消息,很容易引起监听的冲突混淆

针对消息的发送,三种类型各不相同,但是多个同类型之间需要做好区分,否则依然有冲突混淆的问题

iframe的使用和 contentWindow、parent以及postMessage通信方式相关推荐

  1. iframe中跨域页面访问parent的方法

    背景 如上图所示,系统www.a.com/index.html页面中嵌入一个iframe,iframe中访问不同域的www.b.com/index.html 然后b中有个按钮"保存" ...

  2. 关于iframe的contentDocument和contentWindow

    contentDocument是获得iframe子窗口的document对象,但兼容ff和ie8+ contentWindow是获得子窗口的window对象,兼容大部分浏览器,contentWindo ...

  3. 前端十五道html面试题

    目录 01.说一下对语义化的理解?✅ 02.说一下iframe有哪些优点和缺点?✅ 03.DOCTYPE的作用?严格模式和混杂模式的区别? 04.说一下渐进增强和优雅降级的区别? 05. <!D ...

  4. 使用iframe+postMessage跨域操作和通信

    使用iframe+postMessage跨域操作和通信 场景 1. http://XXX/a.html(自己的)页面要操作http://YYY/b.html(其他域名的) 2. 看了网上很多都是同域名 ...

  5. vue页面内嵌iframe使用postMessage进行跨域通信

    跨域 关于跨域的详细资料:跨域,这里只需要明确什么情况下跨域了(等同于两个url什么情况下是非同源关系). 协议.域名.端口三者有其一不同,就算是跨域,就算是非同源 本地环境模拟 借助phpstudy ...

  6. iframe 父子页面传值 postMessage

    使用postMessage给父子页面传值,可以解决跨域问题 父传子:iframe.contentWindow.postMessage() 子传父:尽量放在window.onload里面.window. ...

  7. frame或者iframe的contentwindow属性

    contentwindow属性是指指定的frame或者iframe所在的window对象: <script> function fnnavigate() { for(i=0;i<do ...

  8. iframe.contentWindow

    1.iframe.contentWindow(主页面调用iframe)   此处的iframe是从document取得的,即作作为document的子对象出现,虽然是文档(document)对象,但由 ...

  9. iframe.contentWindow 属性:关于contentWindow和contentDocument区分

    定义和用法 contentDocument 属性能够以 HTML 对象来返回 iframe 中的文档,可以通过所有标准的 DOM 方法来处理被返回的对象. 语法:frameObject.content ...

最新文章

  1. 豆瓣评分 9.4 的算法巨著,这本书带无数读者入门算法
  2. 《Beginning Linux Programming》读书笔记(二)
  3. 品质标签分几种颜色_小标签大学问,如何给实验室仪器贴标签?
  4. 后台获取html控件的值
  5. kibana操作elasticsearch:创建映射字段
  6. ElasticSearch各种查询对象Query的使用
  7. android自助终端界面_ZTHP500 | 桌面式人脸消费终端
  8. 简单的使用Seajs
  9. 视频擦除方向研究(生成技术的一类)
  10. #includealgorithm里的函数
  11. 实践教程 | 万字长文,值得收藏/参考的OpenCV C++基础代码
  12. EC风扇电机如何工作?
  13. 康乐忆享|志愿者心得精选——张凌旭
  14. 用python进行精细中文分句(基于正则表达式)
  15. [UGUI源码剖析]—Rebuild 网格重建(画布刷新)系统
  16. 狂飙高启兰好飒,你看狂飙了吗?
  17. Tableau基础 Tableau 数据集的使用
  18. Excel表格之——某一列生成UUID
  19. 几种功能电路的BIT测试方案设
  20. 《士兵突击》,不抛弃,不放弃

热门文章

  1. 黑魂向project制作学习一:movement(开展的原因和客户端学习的安排)
  2. HDMI与TMDS接口
  3. 荣誉 | 再获认可,百望云入选“EqualOcean 2022中国SaaS 50强”榜单
  4. 华为mate30连接电脑linux,华为mate30引入25W无线充电技术,效率已超越小米
  5. MP4文件介绍及SPS、PPS解析
  6. cocos2d之教你画一条直线
  7. 计算机试题ab级,word计算机一级试题
  8. 希拉里使用开源软件 BleachBit 删除邮件
  9. SpringBoot项目main方法详解
  10. 激活老电脑的第二春:内存盘为Chrome浏览器做缓存