如何实现 iframe 和父站点之间的通信?

在 Web 前端开发中,我们经常需要使用 iframe 来嵌入外部页面。但是,由于浏览器同源策略的限制,iframe 内的页面无法直接与父级页面进行通信。本文将介绍如何通过几种方法实现 iframe 和父站点之间的通信。

1. 使用 URL hash

URL hash 是指 URL 中 # 符号后面的内容,它可以用来在不同页面之间传递信息。在父页面中,可以通过监听 hashchange 事件来获取子页面发送的信息。

以下是一个示例代码:

---- --- ---
------- --------------------------
--------
  ------------------------------------- ---------- -
    --- ------- - ------------------------------
    ------------------- - ---------
  ---
---------

---- --- ---
--------
  --------------------------- - ------- ---------
---------

在子页面中,我们可以通过 window.parent 访问父页面的全局对象,并将信息写入 URL hash。父页面则通过监听 hashchange 事件来获取子页面发送的信息。

2. 使用 postMessage API

postMessage API 可以在不同窗口之间安全地传递消息。在父页面中,可以通过 window.postMessage() 方法向子页面发送消息;在子页面中,可以通过 window.addEventListener('message', handler) 监听消息并做出响应。

以下是一个示例代码:

---- --- ---
------- --------------------------
--------
  ---------------------------------- --------------- -
    -- ------------- --- --------------------- ------- -- ----------
    ------------------- - ------------
  ---
  --- ------ - ---------------------------------
  ---------------------------------------- -------- ----------------------
---------

---- --- ---
--------
  ---------------------------------- --------------- -
    -- ------------- --- --------------------- -------
    ------------------- - ------------
    -------------------------------- --------- --------------
  ---
---------

在父页面中,我们可以通过 window.postMessage() 向子页面发送消息,并传递一个安全的目标窗口源参数。子页面则通过监听 message 事件来获取父页面发送的信息,并用 event.source.postMessage() 方法向父页面回复消息。

3. 使用同域代理页面

如果我们无法修改被嵌入的页面,也无法使用前两种方法,我们可以考虑使用同域代理页面。我们可以创建一个与父页面同域的代理页面,在代理页面中与子页面进行通信,并将信息传递给父页面。

以下是一个示例代码:

---- --- ---
------- --------------------------
--------
  ---------------------------------- --------------- -
    ------------------- - ------------
  ---
---------

---- ---- ---------- ---
------- ---------------------------------------------
--------
  ---------------------------------- --------------- -
    -- ------------- --- --------------------- -------
    ------------------- - ------------
    ------------------------------------- -----
  ---
---------

在父页面中,我们可以将 iframe 的 src 属性设置为代理页面的 URL。代理页面中则包含一个与子页面同域的 iframe,并通过监听 window.postMessage() 来获取子页面发送的信息,并将其传递给父页面。

总结

本文介绍了三种方法来实现 iframe 和父站点之间的通信:URL hash、postMessage API 和同域代理页面。不同场景下应选择不同的通信方式,以便实现最佳的用户体验和安全性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/10172