Могу ли я сделать синхронную междоменную связь с window.postMessage? - PullRequest
5 голосов
/ 30 января 2012

Я подумываю использовать window.postMessage напрямую для междоменной связи.

Если я сделаю:

  1. postMessage() от родителяframe
  2. Загрузить iframe
  3. window.addEventListener("message", callback, false); из дочернего iframe

Когда будут выполнены сообщения, которые я разместил до загрузки iframe?Они гарантированно будут выполнены вообще?Есть ли гарантии синхронизации?

Я хотел бы передать параметр из верхнего кадра, который влияет на инициализацию дочернего кадра.

1 Ответ

7 голосов
/ 07 марта 2012

Функция postMessage () является асинхронной, то есть сразу возвращается.Таким образом, вы не можете установить синхронную связь с ним.

В вашем примере опубликованное сообщение исчезнет в пустоте, поскольку во время выполнения функции postMessage () нет прослушивателя для события сообщения.

Если вы сначала загрузите iframe, а потом вызовете postMessage (), возможно, возникла проблема с синхронизацией.(Исходя из моего опыта, его нет, родительский код всегда выполняется первым, но я не уверен в этом.)

Ниже приведено мое решение проблемы, заключающейся в том, чтобы точно не знать, когда будет готов iframe.

В родительском окне:

  1. Загрузить iframe (тоже асинхронный)
  2. Установить прослушиватель сообщений
  3. Публиковать сообщение в iframe (просто пытаюсь здесь)
  4. Дождаться, пока придут другие сообщения

В iframe:

  1. Настройка прослушивателя сообщений
  2. Отправка сообщения в родительское окно (просто попытка здесь)
  3. Ожидание получения новых сообщений

Кто получает первое сообщение отдругая сторона затем начинает реальное общение.

По моему опыту, сообщение от родителя в iframe всегда теряется, поэтому общение начинается, когда родитель получает сообщение от iframe.Но в этой настройке не важно, какой из них запускается первым.

...