Документация для постсообщения подразумевает, что междоменный обмен сообщениями возможен. Однако:
// When the popup has fully loaded, if not blocked by a popup blocker
Это не очень четкое примечание того, как на самом деле сделать это.
Вообразите два веб-сайта:
qc-a.nfshost.com
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');
Все напрасно.
Помощь?
В настоящее время я наблюдаю две проблемы. Небольшая ошибка в коде и проблема с тайм-аутом.
1) Ошибка, которую я вижу в вашем коде, заключается в том, что вы используете document.addEventListener. Я думаю, что правильный - window.addEventListener. Это в примере на странице postMessage .
2) По истечении времени ожидания вы можете отправить сообщение дочернего окна родительскому окну. Родительское окно затем узнает, когда дочерний элемент будет готов.
Вы открываете окно и постите сообщение друг за другом. Невозможно, чтобы открытый документ был готов принять сообщение post. Попробуйте отложить вызов postMessage до окончания загрузки окна.
Очень простой способ проверить это - обернуть w.postMessage() в setTimeout (на 10 секунд) и посмотреть, сможет ли он отправить сообщение, когда документ будет готов.