Как вы используете window.postMessage через домены?

Кажется, что пункт window.postMessage - обеспечить безопасную связь между окнами/кадрами, размещенными на разных доменах, но это не так на самом деле, похоже, это разрешено в Chrome.

Здесь сценарий:

  • Вставить <iframe> (с src в домене B *) на странице в домене A
  • <iframe> заканчивается в основном <script> тег, в конце которого выполняется...
  • Я вызываю window.postMessage(some_data, page_on_A)

<iframe> наиболее определенно в контексте домена B, и я подтвердил, что встроенный javascript в этом <iframe> выполняется правильно и вызывает postMessage с правильными значениями.

Я получаю это сообщение об ошибке в Chrome:

Невозможно отправить сообщение A. Получатель имеет происхождение B.

Здесь код, который регистрирует прослушиватель событий сообщения на странице A:

window.addEventListener(
  "message",
  function (event) {
    // Do something
  },
  false);

Я также пробовал вызывать window.postMessage(some_data, '*'), но все, что делает это, подавляет ошибку.

Я просто пропустил здесь пункт, это window.postMessage(...), не предназначенное для этого? Или я просто делаю это ужасно неправильно?

* Mime-type text/html, который он должен оставаться.

Ответ 1

Вот пример, который работает в Chrome 5.0.375.125.

Страница B (содержимое iframe):

<html>
    <head></head>
    <body>
        <script>
            top.postMessage('hello', 'A');
        </script>
    </body>
</html>

Обратите внимание на использование top.postMessage или parent.postMessage not window.postMessage здесь

Страница A:

<html>
<head></head>
<body>
    <iframe src="B"></iframe>
    <script>
        window.addEventListener( "message",
          function (e) {
                if(e.origin !== 'B'){ return; } 
                alert(e.data);
          },
          false);
    </script>
</body>
</html>

A и B должны быть чем-то вроде http://domain.com

EDIT:

Из другого вопроса, он выглядит, что домены (здесь и A здесь) должны иметь / для правильной работы postMessage.

Ответ 2

После загрузки следует отправить сообщение от фрейма к родительскому.

кадр script:

$(document).ready(function() {
    window.parent.postMessage("I'm loaded", "*");
});

И послушайте его в ролике:

function listenMessage(msg) {
    alert(msg);
}

if (window.addEventListener) {
    window.addEventListener("message", listenMessage, false);
} else {
    window.attachEvent("onmessage", listenMessage);
}

Используйте эту ссылку для получения дополнительной информации: http://en.wikipedia.org/wiki/Web_Messaging

Ответ 3

Вероятно, вы пытаетесь отправить свои данные с mydomain.com на www.mydomain.com или наоборот, ПРИМЕЧАНИЕ. Вы пропустили "www". http://mydomain.com и http://www.mydomain.com - это разные домены для javascript.