2012-09-16 38 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); 
}