当在一个页面(父页面)中有多个嵌套的iframe(子页面),如何传递参数
时间: 2024-12-17 09:19:35 浏览: 5
在一个页面包含多个嵌套的`iframe`时,每个`iframe`都是独立的窗口,所以直接使用`window.postMessage`可能会遇到命名冲突。这时,可以采用以下方法传递参数:
1. **创建全局变量或事件总线**:
创建一个公共的对象或者发布订阅模式的事件系统,在父页面和所有子页面之间共享数据。例如,可以使用`document.getElementById`获取所有`iframe`,然后给它们添加监听器:
```javascript
let iframeBus = {};
// 在父页面设置监听器
document.querySelectorAll("iframe").forEach(iframe => {
iframe.contentWindow.addEventListener("message", event => {
if (event.origin === 'same-origin') { // 避免跨域
iframeBus[event.data.key] = event.data.value;
}
}, false);
});
// 发送到所有子页面
iframeBus.sendMessageToAllFrames = function(data) {
Object.keys(iframeBus).forEach(key => {
if (iframeBus[key]) {
iframeBus[key].contentWindow.postMessage(data, '*');
}
});
};
2. **利用父元素的`data-*`属性**:
如果子页面都知道他们的层级关系,可以在父级元素上添加自定义的`data`属性来传递信息,子页面通过事件监听获取并解析。
每种方法都需要确保所有的`iframe`能够信任传递过来的信息,并处理好跨域和权限的问题。
阅读全文