связь между двумя детьми iframe с помощью postMessage

у меня есть код вставки, который пользователи могут размещать на своих сайтах. Он создает два дочерних iframes на странице. Я бы хотел, чтобы эти дети могли общаться.

Я использую javascript window.postMessage https://developer.mozilla.org/en-US/docs/DOM/window.postMessage

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

когда все три (родитель и два ребенка) находятся в одном домене, это довольно легко, и у меня есть эта работа с проверкой безопасности, проверяющей e.origin - Это мой собственный сайт

# coffeescript
# host = "http://www.mysite.com"
host = "http://localhost"

receive_message = (e) ->
  console.log("received message from " + e.origin + ": " + e.data)
  return if e.origin != host

  if e.data == "show"
    ...
  else if e.data == "hide"
    ...

window.addEventListener("message", receive_message, false)

что такое элегантный способ проверить происхождение, когда родитель может быть в любом домене?

каков хороший способ разрешить отладку скрипта, где источником может быть localhost?

достаточно просто проверить данные param, если есть не деструктивные / изменяющиеся сообщения передаются?

спасибо!

1 ответов


Почему вы говорите, что ребенок iframes не может общаться напрямую? Вообще-то, могут. Что вы можете сделать в дочернем iframe, это использовать window.parent свойства, чтобы получить ссылку на родительское окно, а затем с помощью родителей frames свойство для получения ссылок на все дочерние iframes (frames свойство дает вам целый ряд таких обращений). После этого, вы можете использовать postMessage по каждой из этих ссылок и установите требуемый origin restrictoin в вызове postMessage, чтобы Вы были уверены только правильный iframe получает сообщение.

обратите внимание, что это будет работать, даже если все три окна (iframe1, родительское окно и iframe2) находятся в разных доменах, потому что iframe1 ничего не делает с родительским окном( что нарушило бы SOP), это только получение ссылок на вложенные фреймы.

ссылки:

https://developer.mozilla.org/en-US/docs/DOM/window.parent

https://developer.mozilla.org/en-US/docs/DOM/window.frames