向所有父级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>