我正在寻找一种方法将postMessage发送到兄弟iFrame,而父页面中没有任何javascript.我遇到的困难是尝试从第一个iFrame中获取另一个iFrame的窗口对象
该页面的布局如下:
html body (http://host.com/)
iFrame#a (http://me.com/a)
iFrame#b (http://me.com/b)
来自iFrame#a我正在尝试:
(iFrame#b window).postMessage(...)
问题是我不知道如何从iFrame#a中获取iFrame#b的窗口对象. parent.getElementById()和其他函数受XSS限制.我只想将postMessage发布到父页面上的所有其他iFrame,这些iFrame来自我上面的示例http://me.com/.
解决方法:
虽然确实不可能与另一个域上的另一个窗口/ iframe交互,但是可以引用这样的窗口/ iframe以及嵌入到该窗口/ iframe中的所有子iframe.这样做的方法是使用window.top.frames(访问顶部窗口对象)或window.parent.frames(访问直接父窗口对象,同时可能有其他更高级别的祖先).无需使用getElementById或其他与DOM相关的功能.有关详细信息,请参阅此内容:https://developer.mozilla.org/en-US/docs/DOM/window.frames
window.frames属性返回一个类似于数组的对象,然后您可以迭代并在每个iframe上执行postMessage.这不会触发同源限制,因为除了在它们上使用postMessage之外,您不会以任何方式与任何窗口进行交互.由于您希望在特定域的每个iframe上执行postMessage,因此您可以执行以下操作:
var frames = window.parent.frames;
for (var i = 0; i < frames.length; i++) {
frames[i].postMessage("hello", targetDomain);
}