首页 > 其他分享 >iframe标签下的通信

iframe标签下的通信

时间:2023-08-16 16:55:27浏览次数:34  
标签:标签 通信 iframeButton iframe msg message event 页面

通常在页面中嵌套iframe的情况下还需要进行消息传递的通信需求。一般分为两种情况:

1.iframe里的链接与父页面链接是非跨域

        这种情况处理比较简单,直接在父级页面下就可以写脚本控制iframe里的元素,同时对iframe里的元素进行操作,例如绑定事件,当事件触发时发送消息给父级页面。

        具体实践脚本如下:

    try{ 
    //绑定窗口消息事件,接收来iframe发送的消息
    window.addEventListener('message', function(ev) { 
        if(ev.data.source == 'pt_event' && ev.data.message == 'iframeButton'){ 
            _pt_sp_2.push('setCustomEvent',{eventName:'buy_product'}); 
        } 
    }, false) 
    //为了避免iframe加载较慢,等2s后绑定元素事件,处理事件触发后获取相关信息并发送父级页面
    setTimeout(function(){ 
        var buttons = document.querySelectorAll('div[id^=product-component-'); 
        if(buttons){ 
            buttons.forEach(function(iframeButton){     
                    iframeButton.querySelector('iframe').contentDocument.body.
                    querySelector('.shopify-buy__btn').
                    addEventListener('click',function(){
                        var msg={}; 
                        msg['source'] = 'pt_event'; 
                        msg['message'] = 'iframeButton'; 
                      parent.postMessage(msg,'*'); 
                    },false) 
            }) 
        } 
    },2000) 
}catch(e){ 
    console.log('ptmsg:'+e) 
}

2.iframe里的链接与父页面链接是跨域关系,这种情况需要在父页面与iframe里分别进行编写脚本进行接收消息与发送消息。

        父页面中监听消息:

try{ 
    window.addEventListener('message', function(ev) { 
        if(ev.data.source == 'pt_event' && ev.data.message == 'iframeButton'){ 
            _pt_sp_2.push('setCustomEvent',{eventName:'buy_product'}); 
        } 
    }, false) 
}catch(e){ 
    console.log('ptmsg:'+e) 
} 

        iframe中事件监听及发送消息:

try{ 
    var btn_event = document.body.querySelector('.layout_image'); 
    if(btn_event){ 
        btn_event.addEventListener('click',function(){ 
        var msg={}; 
        msg['source'] = 'pt_event'; 
        msg['message'] = 'iframeButton'; 
        parent.postMessage(msg,'*'); 
        },false) 
    } 
}catch(e){ 
    console.log('ptmsg:'+e) 
} 

 

标签:标签,通信,iframeButton,iframe,msg,message,event,页面
From: https://www.cnblogs.com/yangzhihui/p/iframe_postmessage.html

相关文章

  • Django博客开发教程:实现标签页面
    标签列表是的URL是:网站域名/tag/标签名,标签名是URL里的<tag>传进来的。标签页面和列表页面展现样式是一样的,前面我们也提及过,所以我们直接复制list.html页面,然后更名为tags.html。视图函数代码:blog/views.pydef tag(request, tag):    list = Article.objects.filter......
  • teamcenter soa 服务报错:The server returned an internal server。操作执行期间,与Te
     原因:这个是代码有一个空指针,去加载属性所以报这个错误 这一段代码,框起来的就是空......
  • 智能标签系统如何助力智能推送服务
    智能推送系统介绍智能推送系统是一种利用人工智能和大数据等技术,根据用户的需求、兴趣、行为等信息,自动化地向用户推送个性化内容的系统。它可以通过用户画像、历史行为、实时数据等多种数据源的分析和挖掘,为每个用户提供具有高度相关性和个性化的推送内容。MobPush就是一款智能化......
  • EL表达式与JSTL标准标签库
     先导入2个jar包使用指令<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%> <%@pagelanguage="java"contentType="text/html;charset=UTF-8"  pageEncoding="UTF-8"%><%@tagliburi=&qu......
  • java死锁、线程状态、线程通信、线程池
    1.回顾java实现多线程:[1]继承Thread类并重写run方法[2]实现Runnable接口线程Thread中常用的方法:setName():Thread.currentThread().getName():​staticvoidsleep();staticvoidyield():join():setDeamon()设置后台线程线程安全问题:---当......
  • vue.js框架的iframe页面计时器无法销毁的解决方法
    同学试过使用生命周期等方式都不能清除计时器;因而改用这个方法;1,首先vue页面上随便写个有高度的div如下:用refs获取高度<divclass="hub-fixed-box":style="{width:fixedWidth+'px'}"ref="fixedTop"></div>2.定时器定义在data内data:{timer:null,//计时器}3,初始......
  • 部署工业物联网可以选择哪些通信方案?
    部署工业物联网有诸多意义,诸如提升生产效率,降低管理成本,保障生产品质稳定,应对长期从业劳动力变化趋势等。针对不同行业、场景,工业物联网需要选择不同的通信方案,以达到成本和效益的最佳平衡。本篇就简单介绍一些IIoT部署常用的通信解决方案: 1、Wi-Fi方案:此方案主要基于工业无......
  • 提速 40%,融云基于 QUIC 深度优化通信协议
    各分位(P99、P95、P50)连接速度提升30%~50%;关注【融云全球互联网通信云】了解更多网络延迟低连接耗时终端占比提升50%,高连接耗时终端占比压缩至1%以内;在基础设施受限的弱网地区和连接效果难保证的跨网场景下,均可获得与正常网络相当的顺畅体验。——这些都是融云基于QUIC深度优......
  • Qt下的基本TCP网络通信流程
    给大家讲一下如何使用Qt相关类的进行TCP通信。前置知识:c++基础、qt基础、网络基础使用Qt提供的类进行基于TCP的套接字通信需要用到两个类:​ QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。​ QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。这两个套......
  • 进程间通信
    一、基本概念什么是进程间通信:是指两个或多个进程之间需要协同工作、交互数据的过程,因为进程之间是相互独立工作的,为了协同工作就需要进行通信来交互数据进程间通信的分类:简单的进程间通信:信号(携带附加信息)、文件、环境变量、命令行参数等传统的进程间通信:管道文件(有名......