Связь между двумя детьми 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)
Что такое элегантный способ проверить происхождение, когда родитель может находиться в любом домене?
Что такое хороший способ разрешить отладку script, где источник может быть localhost?
Достаточно ли просто проверить параметр данных, если передаются неразрушающие/изменяющиеся сообщения?
Спасибо!
Ответы
Ответ 1
Почему вы говорите, что дочерние iframe не могут напрямую общаться? Собственно, они могут. Что вы можете сделать в дочернем iframe, используется свойство window.parent
, чтобы получить ссылку на родительское окно, а затем использовать родительское свойство frames
для получения ссылок на все дочерние iframes (свойство frames
дает вам массив таких ссылок). После этого вы можете использовать postMessage
для каждой из этих ссылок и установить требуемое ограничение места в вызове postMessage, чтобы убедиться, что только правильный iframe получает сообщение.
Обратите внимание, что это будет работать, даже если все три окна (iframe1, родительское окно и iframe2) находятся в разных доменах, потому что iframe1 ничего не делает с родительским окном (которое нарушает SOP), оно только извлекает ссылки на вложенные iframes.
Ссылки:
https://developer.mozilla.org/en-US/docs/DOM/window.parent
https://developer.mozilla.org/en-US/docs/DOM/window.frames