两个iframe正在通信:SecurityError

Two Iframes are communicating: SecurityError

本文关键字:SecurityError 通信 iframe 两个      更新时间:2023-09-26

我有两个iframe。这些iframe通过postMessage进行通信。

从一个iframe,如果我做以下操作,它不工作

// Broadcast to all iframes.
parent.frames.forEach(function (frame) {
  frame.postMessage(data, 'http://localhost:4000');
});
误差

:

Uncaught SecurityError:阻止了一个帧的起源为http://...访问一个帧的起源为http://...。协议、域和端口必须匹配。

然而,如果我执行以下操作,它就能很好地工作。无错误信息。为什么?

for (var i = 0 ; i < parent.frames.length ; ++i) {
  parent.frames[i].postMessage(data, 'http://localhost:4000');
}

这里的问题看起来可以读作

为什么parent.frames.forEach给出SecurityError当我可以在for中迭代它们时?

这是因为parent.frames不是数组而是窗口实例,因此,当您尝试访问.forEach时,它正在寻找不同的窗口属性,安全性阻止访问。

来自window.frames的MDN页面(parent是一个Window)

返回窗口本身,它是一个类似于数组的对象,列出当前窗口的直接子框架。

如果你想使用.forEach,从(一个可引用的)Array的原型

中获取它
Array.prototype.forEach.call(parent.frames, callback);