有没有办法在同一个 iframe 上向 postMessage 添加多条消息?

Posted

技术标签:

【中文标题】有没有办法在同一个 iframe 上向 postMessage 添加多条消息?【英文标题】:Is there a way to add multiple messages to postMessage on the same iframe? 【发布时间】:2021-07-30 18:59:11 【问题描述】:

我有一个 iframe,它是一个表单。 iframe 需要从父窗口中抓取一些 url 参数并将它们添加到一些隐藏字段中。

目前在源域上我有这个:

var iframe = $('iframe[src^="DOMAIN"]'),
src = iframe.attr('src'),
data = window.location.search,
destination = iframe.get(0).contentWindow;

destination.postMessage(data, src);

在 iframe/其他域上我有这个,还有一个用于填写表单输入的函数:

var eventMethod = window.addEventListener ?
    "addEventListener" :
    "attachEvent";
  var eventer = window[eventMethod];
  var messageEvent = eventMethod === "attachEvent" ?
    "onmessage" :
    "message";
  eventer(messageEvent, function(e) 
    $('#output').text(e.data);
  );

问题是网站上正在使用的其他东西(iframe 调整大小)在同一个 iframe 上使用相同的 contentWindow

我认为数据正在被覆盖,因为 e.data 显示 [iFrameSizer]iFrameResizer0:8:false:false:... 而我期望 ?utm_campain=test.. .

有没有办法使用相同或不同的对象属性来发送/接收消息?

【问题讨论】:

【参考方案1】:

您可以发送一个对象并检查该对象的属性以了解您要使用的消息:

您可能还想检查源是父窗口

类似:

var iframe = $('iframe[src^="DOMAIN"]'),
src = iframe.attr('src'),
data = searchParams: window.location.search,
destination = iframe.get(0).contentWindow;

destination.postMessage(data, src);

帧内:

eventer(messageEvent, function(e) 
    if(e.source !== window.parent)
      console.log('Messaage not from parent');
      return;
    

   if(typeof e.data === 'object' && e.data.hasOwnProperty('searchParams') )
       $('#output').text(e.data.searchParams);
   
);

【讨论】:

以上是关于有没有办法在同一个 iframe 上向 postMessage 添加多条消息?的主要内容,如果未能解决你的问题,请参考以下文章

在服务器事件上向客户端发送信息

iframe与父页面之间通讯跨域问题

iframe跨域通信方案

删除 iframe 后有没有办法重新加载?

有没有办法让 IFRAME 中的内容溢出到父框架上?

如何在 DiscordJS v13 上向用户添加角色?