iframe 调用父窗口的 JavaScript

阅读时长 4 分钟读完

在前端开发中,我们经常会使用 iframe 元素来嵌入其他网页或部件。当 iframe 中的内容需要与父页面进行通信时,一种常见的需求是在 iframe 中调用父窗口的 JavaScript 函数。本文将介绍如何实现这个功能。

方法一:使用 window.parent

如果 iframe 和父页面在同一个域名下,我们可以使用 window.parent 对象来访问父页面的 JavaScript 函数。下面是一个例子:

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

在子页面中,我们可以使用 window.parent.greet 来调用 greet 函数。这个方法非常简单易懂,但要注意安全性问题。如果不同域名的页面之间使用此方法通信,就可能存在安全风险。

方法二:使用 postMessage

为了解决跨域通信的问题,我们可以使用 postMessage API。 postMessage 允许跨窗口通信,包括不同域名的页面间的通信。

在父页面中,我们可以监听 message 事件,并通过 event.source 获取消息来源(也就是子页面),然后根据消息内容来执行相应的操作:

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

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

在子页面中,我们可以使用 window.parent.postMessage 来发送消息到父页面:

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

这个方法虽然比较复杂,但是更加安全可靠,并且可以支持跨域通信。

总结:根据实际需求选择合适的方式

在实际开发中,我们需要根据具体需求来选择适合的方法。如果页面在同一个域名下,可以使用 window.parent 方法来调用父页面的 JavaScript 函数;如果页面存在跨域通信需求,我们则需要使用 postMessage API 来实现。

示例代码:https://github.com/chatgpt/articles/blob/main/iframe-calling-parent-javascript

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

纠错
反馈