2010-07-26 84 views
7

postMessage的文檔意味着跨域消息傳遞是可能的。但是:我該如何做跨域postMessage?

// When the popup has fully loaded, if not blocked by a popup blocker 

這不是很清楚的記的如何真正做到這一點。

想象一下兩個網站:

  1. [家長]託管在qc-a.nfshost.com
  2. (孩子)託管在qc-b.quadhome.com

在父:

document.addEventListener('message', function(e) { 
    alert('Parent got (from ' + e.origin + '): ' + e.data); 

    e.source.postMessage('Round-tripped!', 'http://qc-b.quadhome.com'); 
}, false); 

function go() { 
    var w = window.open('http://qc-b.quadhome.com', 'test'); 

    /* This doesn't work because same-origin policy prevents knowing when 
    the opened window is ready. */ 

    w.postMessage('Vain attempt.', 'http://qc-b.quadhome.com'); 
} 

而且,在小孩:

document.addEventListener('message', function(e) { 
    alert('Child got (from ' + e.origin + '): ' + e.data); 
}, false); 

window.opener.postMessage('Ready!', 'http://qc-a.nfshost.com'); 

全部無濟於事。

幫助?

回答

8

目前,我看到兩個問題。代碼中的小錯誤和超時問題。

1)我在你的代碼中看到的錯誤是你正在使用document.addEventListener。我認爲正確的是window.addEventListener。它在postMessage頁面的示例中。

2)超時,你可以有子窗口postMessage父。父窗口然後會知道孩子什麼時候準備好了。

+4

總之,我是個白癡。用'window'代替'document',通過'window.opener.postMessage'完成回調。謝謝! – 2010-07-26 07:45:40

+0

適應我們最好的:) – 2010-07-26 07:47:59

0

您打開窗口&將消息發送給對方。打開的文檔無法接收郵件信息。嘗試延遲postMessage調用,直到窗口完成加載。

測試此方法的一個非常簡單的方法是將w.postMessage()包裝在setTimeout(10秒鐘)中,並查看文檔準備就緒後是否可以發佈它。

+1

沒錯。代碼中的評論提到,當窗口準備就緒時,我無法知道(我知道)。 10秒的超時時間似乎有點...哈克。 注意在子窗口中,我嘗試做一個postMessage指示準備工作返回到開啓者。這也失敗了。思考? – 2010-07-26 06:58:55