iframe的父子页面通信

简介: iframe的父子页面通信

平时工作中有时会遇到页面嵌套的情况,一般是用iframe解决。那么,两个页面如何通信呢?下面分两种情况进行:

一、父子页面同源的情况
现在有两个不同源的iframe嵌套页面,父页面parent.html,子页面child.html,二者代码如下:

// parent.html

// ...
<iframe
  id='testIframe'
  name='test'
  src='./child.html'
  frameborder='0'
  scrolling='no'>
</iframe>

<script type="text/javascript">
    function parentConsole(data) {
   
        console.log(data)
    }
</script>
// ...
// child.html
// ...
<script type="text/javascript">
    function childConsole(data) {
   
        console.log(data)
    }
</script>
// ...
1. 父页面调用子页面方法
可以通过iframe的id或者name属性拿到iframe的window对象,然后直接调用子页面方法即可。我们把需要发送给子页面的信息放到方法childConsole里。如下:

var iframeDom = document.getElementById('testIframe');
// 需要等iframe加载完成后执行,不然有可能会报错
iframeDom.onload = function () {
   
    var data = 'hello, child!';
    iframeDom.contentWindow.childConsole(data);
}
AI 代码解读

var iframeDom = document.getElementById('testIframe');
iframeDom.onload = function () {
   
    var data = 'hello, child!';
    test.window.childConsole(data);
}
AI 代码解读
  1. 子页面调用父页面方法
    可以通过window.top或者window.parent拿到父页面的window对象。然后直接调用父页面的方法即可。同样,把需要发给父页面的信息放到方法parentConsole里。如下:
var data = 'hello, parent!';
window.top.parentConsole(data); // 或者使用window.parent.parentConsole(data)也行
AI 代码解读

二、父子页面跨域的情况
可以通过postMessage来实现通信。

otherWindow.postMessage(message, targetOrigin, [transfer]);
AI 代码解读

其中的参数:
otherWindow
目标窗口。比如 iframe 的 contentWindow 属性
message
将要发送到其他 窗口 的数据。
targetOrigin
目标窗口的域。其值可以是字符串"*"(表示无限制)或者一个 URI。不提供确切的 targetOrigin 将导致数据泄露到任何对数据感兴趣的恶意站点。

现在有两个不同源的iframe嵌套页面,父页面http://127.0.0.1:8001/parent.html,子页面http://127.0.0.1:8002/child.html(本地分别对两个html起了两个服务),其中父页面嵌套部分代码如下:

// http://127.0.0.1:8001/parent.html
<iframe
  id='testIframe'
  name='test'
  src='http://127.0.0.1:8002/child.html'
  frameborder='0'
  scrolling='no'>
</iframe>
AI 代码解读
  1. 父页面发送信息,子页面接收信息
    ```js
    // http://127.0.0.1:8001/parent.html
    // 父页面发送信息
    document.getElementById('testIframe').onload = function () {
    test.window.postMessage('hello, child!', 'http://127.0.0.1:8002');
    }

// http://127.0.0.1:8002/child.html
// 子页面接收信息
window.addEventListener('message', e => {
// 通过origin对消息进行过滤,避免遭到XSS攻击
if (e.origin === 'http://127.0.0.1:8001') {
console.log(e.origin) // 父页面所在的域
console.log(e.data) // 父页面发送的消息, hello, child!
}
}, false);

2. 子页面发送信息,父页面接收信息
```js
// http://127.0.0.1:8002/child.html
window.top.postMessage('hello, parent!', 'http://127.0.0.1:8001');

// http://127.0.0.1:8001/parent.html
window.addEventListener('message', e => {
    // 通过origin对消息进行过滤,避免遭到XSS攻击
    if (e.origin === 'http://127.0.0.1:8002') {
        console.log(e.origin) // 子页面所在的域
        console.log(e.data)  // 子页面发送的消息, hello, parent!
    }
}, false);
AI 代码解读

通过postMessage和window.addEventListener('message', e => { ... })配合使用,我们就能够完成跨域iframe父子页面的通信。
当然对于同源的iframe父子页面也可以采用postMessage的方式来发送接收信息。

目录
打赏
0
6
6
1
99
分享
相关文章
关于ElementUI之动态树+数据表格+分页实例
关于ElementUI之动态树+数据表格+分页实例
481 0
node与npm版本对应关系以及使用nvm管理node版本
node与npm版本对应关系以及使用nvm管理node版本
5322 0
Threejs实现模拟管道液体流动
Threejs实现模拟管道液体流动
2846 0
Threejs实现模拟管道液体流动
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
2199 0
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
|
11月前
|
Vue3倒计时(Countdown)
这篇文章介绍了如何在Vue 3中创建一个可自定义的倒计时组件(Countdown),允许设置标题、前缀、后缀、格式和样式,并提供了组件的实现代码和使用示例。
795 2
Vue3倒计时(Countdown)
|
7月前
|
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
904 14
2024年新一代WebOffice内嵌网页组件,Web网页在线编辑Word/Excel/PPT
WebOffice控件面临兼容性、用户体验和维护难题。随着浏览器更新,依赖插件的技术不再适用,如Chrome不再支持NPAPI和PPAPI。产品普遍不支持多版本Office并存,定制能力弱,升级复杂。猿大师办公助手提供了解决方案,它兼容多种浏览器,包括最新版和国产浏览器,不依赖插件,支持文档对比,具有丰富的功能和接口,兼容多种Office版本,允许源码级定制,提供终身技术支持,并实现静默在线升级。适用于多种行业和操作系统。
710 85
微信PC端小程序无法加载数据
某些小程序在PC端小程序打开会出现白屏或无法加载数据的情况,本篇文章整理了几种常见情况的解决方案。
1243 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问