不同iframe中通讯,以广播的形式发送消息

向所有父级iframe发送广播消息

  const broadcastParentWindowMessage = messageData => {
    let needFind = true
    let parentWindowList = [window]
    while (needFind) {
      try {
        const curWidnow = parentWindowList[parentWindowList.length - 1]
        const parentWindow = curWidnow.parent

        if (curWidnow == top) {
          needFind = false
          break
        }
        console.log(parentWindowList)
        parentWindowList.push(parentWindow)
      } catch (err) {
        break
      }
    }
    parentWindowList.map(item => {
      item.postMessage(messageData, '*')
    })
  }

向所有子级iframe发送广播消息

   const broadcastMessageToIfraames = (message) => {
    // 获取页面上所有的iframe元素
    const iframes = document.getElementsByTagName('iframe');
    // 遍历所有iframe,并发送消息
    for (let i = 0; i < iframes.length; i++) {
        const iframe = iframes[i];
        iframe.contentWindow.postMessage(message, '*');
    }
}

使用示例:
a->b->c,
a.html

<button onclick="sendMessageA()">A 发送消息</button>
<iframe src="./test-b.html"></iframe>
<script>
  const sendMessageA = () => {
    let parentData = { type: 'action', name: 'test-b', data: {} }
    broadcastParentWindowMessage(parentData, '*')
  }
  window.addEventListener(
    'message',
    function (e) {
      console.log('listener message', 'test-a', e.data)
    },
    false
  )
</script>

b.html

<button onclick="sendMessageB()">B 发送消息</button>
<iframe src="./test-c.html"></iframe>
<script>
  const sendMessageB = () => {
    let parentData = { type: 'action', name: 'test-b', data: {} }
    broadcastParentWindowMessage(parentData, '*')
  }
  window.addEventListener(
    'message',
    function (e) {
      console.log('listener message', 'test-b', e)
    },
    false
  )
</script>

c.html

<button onClick="sendMessage()">发送消息</button>
<script lang="ts">
  const sendMessage = () => {
     let parentData = { type: 'action', name: 'test-b', data: {} }
     broadcastParentWindowMessage(parentData, '*')
  }
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值