2012-09-16 39 views
1

我正在寻找一种方法postMessage兄弟iFrame没有任何JavaScript在父页面。我遇到的困难正试图从第一的iFrame获得其他的iFrame窗口对象我如何postMessage到兄弟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#bparent.getElementById()等功能都受XSS限制。我只想在上面的示例中向我的域http://me.com/的父页面上的所有其他iFrame发送postMessage

回答

3

由于iframe无法与其内部的页面进行交互(也不包括该页面内的任何内容),因此您将无法执行此操作,除非父级处于同一个域下(在您的示例中,它不是) 。如果可能的话,那么您会发现XSS安全问题,因为您表示您知道。

相反,你可以:

  • 设置一个cookie在/ A /和民意调查,它在/ B /(这将是昂贵的,虽然如/ B /会以某种方式继续进行,以电话服务器)
  • 使用“HTML5”持久性数据存储机制,存储从/数据/和民意调查,它在/ b /(或许localStorage可以使用)
  • 使用websocket链接所有的兄弟姐妹通过服务器
  • 重新考虑你想要做的事: nd非常奇怪你想要实现的目标 - 你确定没有比使用这样的iframe更好的方法吗?
5

虽然这是事实,这是不可能与另一个窗口/ IFRAME是另一个域相互作用,它可能得到引用这样一个窗口/ iframe和所有的孩子I帧嵌入到窗口/ 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); 
}