Задать вопрос

HTML5 postMessage из ifram-a parent-y?

Стоит задача — открывать в айфрейме сторонний сайт и принимать от него сообщение. На стороннем сайте подключается js из третьего источника (есть возможность его редактировать), в нем пишу parent.window.postMessage(«fgdsgdf», '*'). На главной странице (в которой создается iframe) отлавливаю событие window.addEventListener(«message», receiveMessage, false). Работает в ie, ff, safari, в хроме ни в какую.

Выдает:

[blocked] The page at %сторонний_сайт% ran insecure content from %третий_источник%/скрипт.js.

Unsafe JavaScript attempt to access frame with URL bla-bla from frame with URL bla-bla. Domains, protocols and ports must match.



Похоже, что хром блокирует js из третьего источника (даже если там нет никаких обращений к parent-y) и он не выполяется. В сафари (один движок с хромом) выдает такие же ошибки, но работает. Сторонний сайт работает через https, сайт, открывающий iframe — нет. Что я упускаю?



UPD: Решение — js подключался по протоколу http — замена на https помогла.
  • Вопрос задан
  • 13826 просмотров
Подписаться 7 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rebulus
@Rebulus
К сожалению, данный вариант не пропустит Вас в связи с политикой безопасности. Но Вы можете попробовать следующее решение:
  1. Из сайта A послать сообщение postMessage в iframe B, в котором грузится сторонний js script C.
  2. Script C должен при инициализации подписаться на событие window.addEventListener(«message», ...)
  3. В это событие из postMessage передастся объект event. Где event.source — это ссылка на DOM объект окна, вызвавшего событие.
  4. Вызвать в обработчике отправку сообщения на сайт A с помощью event.source.postMessage(...)


Пример скриптов:
  • На сайте А по загрузке документа выполнить:

	var iFrame = ...// создание переменной, ссылающийся на DOM элемент iframe B
	iFrame.contentWindow.postMessage('test message', '*');
	window.addEventListener(
		"message",
		function (event) {
			// Обработка сообщения от iframe B
		},
		false);

  • В Script C:

	window.addEventListener(
		"message",
		function (event) {
			event.source.postMessage('test message', '*');
		},
		false);

Ссылка на описание postMessage.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Насколько мне известо в сафари и хроме есть различия в рендринге (несмотря на то что оба работают на WebKit), да и движки JavaScript у них тоже абсолютно разные.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы