связь между двумя детьми 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), это только получение ссылок на вложенные фреймы.
ссылки: