Как вы используете window.postMessage через домены? - PullRequest
79 голосов
/ 11 августа 2010

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

Вот сценарий:

  1. Вставить
  2. Я вызываю window.postMessage ( some_data , page_on_A )

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

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

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

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

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

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

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

* MIME-тип текста / HTML, который он должен оставаться.

Ответы [ 3 ]

75 голосов
/ 11 августа 2010

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

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

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

Обратите внимание на использование top.postMessage или parent.postMessage, а не 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 и B) должны иметь /, чтобы postMessage работал правильно.

21 голосов
/ 04 декабря 2013

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

Фрейм-скрипт:

$(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

2 голосов
/ 17 июня 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...