iframe与主窗口跨域通信:实现及示例

5 下载量 32 浏览量 更新于2024-09-01 收藏 137KB PDF 举报
"这篇文章主要介绍了如何在iframe与主框架之间实现跨域的相互访问,提供了同域环境下的示例代码,对于需要处理此类问题的开发者具有参考价值。" 在Web开发中,iframe常用于嵌入其他网页内容,而当iframe与主框架不在同一个域名下时,浏览器出于安全考虑会阻止它们之间的直接通信,这就是所谓的跨域问题。然而,在某些场景下,如页面间的交互、数据共享等,我们需要解决这个问题。以下将详细讲解如何在同域和跨域环境下实现iframe与主框架的相互访问。 1. 同域相互访问 如同描述中的例子,当A.html和B.html在同一域名(比如localhost)下,可以直接通过window对象访问彼此的函数。以下是实现步骤: - A.html中创建一个iframe,并设置name属性,如`name="myframe"`。 - A.html中定义一个函数fMain(),并创建一个按钮,点击时调用`exec_iframe()`函数,该函数通过`window.myframe.fIframe();`来调用B.html中的函数。 - B.html中定义一个函数fIframe(),可以在适当的地方调用A.html中的函数,如`window.parent.fMain();`。 2. 跨域相互访问 跨域访问需要使用到浏览器提供的`postMessage`和`message`事件。`postMessage`允许向任何窗口发送消息,无论它是否在相同的源下。接收方通过监听`message`事件来接收消息。 - A.html(父窗口)中,使用`window.postMessage(data, targetOrigin)`发送消息,其中data是传递的数据,targetOrigin是iframe的源。 - B.html(iframe)中,添加事件监听器`window.addEventListener('message', function(event) {...})`,当接收到消息时,可以通过`event.data`获取数据,然后执行相应操作。同时,也可以通过`parent.postMessage`向A.html发送消息。 需要注意的是,为了确保安全性,`postMessage`的targetOrigin参数应该指定为特定的域名,或者使用星号`*`表示任何来源(但这会降低安全性)。此外,为了防止恶意脚本注入,接收方应验证`event.origin`(发送消息的源)是否匹配预期的源。 总结,实现iframe与主框架跨域相互访问主要依靠`postMessage`和`message`事件。在同域环境下,直接通过window对象访问即可。理解并掌握这些技术,对于进行复杂Web应用的开发至关重要。