• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    html父子页面iframe双向发消息的实现示例

    发布者: 嘉神 | 发布时间: 2025-8-16 19:05| 查看数: 50| 评论数: 0|帖子模式

    某天,领导提了一个需求,主页面里面嵌套iframe,父子页面双向发送消息。然后我就提了一个方案: postMessage
    知识理论准备:
    postMessage方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。
    语法:
    1. otherWindow.postMessage(message, targetOrigin, [transfer]);
    复制代码
         
    • otherWindow:其他窗口的引用,如 iframe的contentWindow、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。   
    • message:将要发送到其他window的数据。   
    • targetOrigin:指定那些窗口能接收到消息事件,其值可以是字符串 “*” 表示无限制,或者是一个URI。   
    • transfer:是一串和message同时传递的Transferable对象,这些对象的所有权将被转移给消息的接收方,而发送方将不再保留所有权。
    postMessage方法被调用时,会在所有页面脚本执行完毕之后像目标窗口派发一个 MessageEvent 消息,该MessageEvent消息有四个属性需要注意:
         
    • type:表示该message的类型   
    • data:为 postMessage 的第一个参数   
    • origin:表示调用postMessage方法窗口的源   
    • source:记录调用postMessage方法的窗口对象
    操作流程如下:
    1.准备两个页面
         
    • http://a.com/main.html 主页面   
    • http://b.com/iframepage.html 嵌套页面
    main.html
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>iframe+postMessage 跨域通信 主页面</title>
    6. </head>
    7. <body>
    8.     <h1>主页面</h1>
    9.     <iframe id="child" src="http://b.com/iframepage.html"></iframe>
    10.     <div>
    11.         <h2>主页面接收消息区域</h2>
    12.         <span id="message"></span>
    13.     </div>
    14. </body>
    15. </html>
    复制代码
    iframepage.html
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>iframe+postMessage跨域通信 子页面</title>
    6. </head>
    7. <body>
    8.     <h2>子页面</h2>
    9.     <div>
    10.         <h3>接收消息区域</h3>
    11.         <span id="message"></span>
    12.     </div>
    13. </body>
    14. </html>
    复制代码
    2、父向子发送消息
    main.html
    1. <script>
    2.     window.onload = function(){
    3.         document.getElementById('child')
    4.          .contentWindow.postMessage("主页面消息",
    5.                 "http://b.com/iframepage.html")
    6.     }
    7. </script>
    复制代码
    注意:
    一定是页面加载完成后在发送消息,否则会因为 iframe 未加载完成报错。
    1. Failed to execute ‘postMessage’ on ‘DOMWindow’
    复制代码
    子页面接收消息:
    iframepage.html
    1. <script>
    2.     window.addEventListener('message',function(event){
    3.         console.log(event);
    4.         document.getElementById('message').innerHTML = "收到"
    5.             + event.origin + "消息:" + event.data;
    6.     }, false);
    7. </script>
    复制代码
    此时可看到页面中,iframe的子页面中打印了
    1. 收到<a target="_blank" href="http://a.com">http://a.com</a>消息:主页面消息`
    复制代码

    以及控制台打印了MessageEvent对象。

    3、子向父发送消息
    子页收到消息后回复父页面
    iframepage.html
    1. <script>
    2.     window.addEventListener('message',function(event){
    3.         console.log(event);
    4.         document.getElementById('message').innerHTML = "收到"
    5.             + event.origin + "消息:" + event.data;
    6.         top.postMessage("子页面消息收到", 'http://a.com/main.html')
    7.     }, false);
    8. </script>
    复制代码
    父页面收到消息并显示:
    1. window.addEventListener('message', function(event){
    2.     document.getElementById('message').innerHTML = "收到"
    3.         + event.origin + "消息:" + event.data;
    4. }, false);
    复制代码

    4、完整代码
    main.html
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>iframe+postMessage 跨域通信 主页面</title>
    6. </head>
    7. <body>
    8.     <h1>主页面</h1>
    9.     <iframe id="child" src="http://b.com/iframepage.html"></iframe>
    10.     <div>
    11.         <h2>主页面接收消息区域</h2>
    12.         <span id="message"></span>
    13.     </div>
    14. </body>
    15. <script>
    16.     window.onload = function(){
    17.         document.getElementById('child')
    18.          .contentWindow.postMessage("主页面消息",
    19.             "http://b.com/iframepage.html")
    20.     }
    21.     window.addEventListener('message', function(event){
    22.         document.getElementById('message').innerHTML = "收到"
    23.          + event.origin + "消息:" + event.data;
    24.     }, false);
    25. </script>
    26. </html>
    复制代码
    iframepage.html
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>iframe+postMessage跨域通信 子页面</title>
    6. </head>
    7. <body>
    8.     <h2>子页面</h2>
    9.     <div>
    10.         <h3>接收消息区域</h3>
    11.         <span id="message"></span>
    12.     </div>
    13. </body>
    14. <script>
    15.     window.addEventListener('message',function(event){
    16.         if(window.parent !== event.source){return}
    17.         console.log(event);
    18.         document.getElementById('message').innerHTML = "收到"
    19.             + event.origin + "消息:" + event.data;
    20.         top.postMessage("子页面消息收到", 'http://a.com/main.html')
    21.     }, false);
    22. </script>
    23. </html>
    复制代码
    到此这篇关于html父子页面iframe双向发消息的实现示例的文章就介绍到这了,更多相关html父子页面iframe双向发消息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表