iframe标签下的通信
通常在页面中嵌套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)
}
分类:
javascript
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?