在iFrame之间进行通信,主要有以下几种方式:
1. 使用 window.parent 和 window.frames(同源情况下):
如果iFrame和父页面属于同一源(即协议、域名和端口都相同),可以通过 window.parent 在iFrame中访问父页面的 window 对象,或者通过 window.frames(或 window.frames[index]/window.frames[name])在父页面访问iFrame的 window 对象。然后,可以在这些 window 对象上设置属性或调用函数来进行通信。
2. 使用 postMessage 方法:
postMessage 是HTML5引入的API,允许不同窗口、iFrame甚至不同域之间的JavaScript进行通信。发送方使用 postMessage 方法发送消息,接收方需要监听 message 事件来接收消息。postMessage 方法接受两个参数:消息数据和目标窗口或iFrame的origin。例如,父页面向子iFrame发送消息:
document.getElementById("mapIframe").contentWindow.postMessage("父页面向子页面发送消息", "*");
子iFrame向父页面发送消息:
window.parent.postMessage('子页面向父页面发送消息','*');
接收方监听 message 事件:
window.addEventListener("message", function(event) {
if (event.origin === "http://example.com") {
console.log(event.data); // 处理接收到的数据
}
});
这种方式可以解决跨域问题,但需要iFrame内外的协作。
3. 使用本地缓存(localStorage/sessionStorage 等)存入和获取(同源情况下):
如果iFrame和父页面属于同一源,可以使用 localStorage 或 sessionStorage 来存储和读取数据,从而实现通信。
4. 设置 document.domain(主域相同子域不同的情况下):
对于主域相同子域不同的两个页面,可以通过设置 document.domain 来解决跨域通信问题。两个页面都设置 document.domain 为当前的主域地址,然后就可以进行通信。
5. 使用中间页面:
还可以使用一个与父页面同域名但不同路由的中间页面,子页面加载中间页面,中间页面调用父页面的方法,从而实现子页面调用父页面的方法。
以上方法中,postMessage 是最常用且安全的方式来实现iFrame之间的通信,特别是当涉及到跨域时。其他方法则更多地用于同源情况下的通信。