簡體   English   中英

如何進行跨域postMessage?

[英]How can I do cross-domain postMessage?

postMessage的文檔意味着可以進行跨域消息傳遞。 然而:

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

這不是一個非常清楚的說明如何實際做到這一點。

想象一下兩個網站:

  1. [家長]在qc-a.nfshost.comqc-a.nfshost.com
  2. [兒童]在qc-b.quadhome.comqc-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');

一切都無濟於事。

救命?

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

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

2)使用超時,您可以將子窗口postMessage設置為父窗口。 然后父窗口將知道孩子何時准備好。

您打開窗口並在彼此之后發布消息。 打開的文檔無法接受發布消息。 嘗試延遲postMessage調用,直到窗口加載完畢。

測試這個的一個非常簡單的方法是將w.postMessage()包裝在setTimeout中(持續10秒)並查看它是否可以在文檔准備好時發布它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM