Ответ 1
Так как iframe изолирован песочницей, он потерял доступ к своим исходным данным.
добавление allow-same-origin
в свойство изолированной песочницы iframe заставит его работать снова.
Там что-то не получается о происхождении события с событием postMessage javascript.
Вот моя главная страница:
<html>
<body>
<h1>Test</h1>
<h2>Outside</h2>
<iframe src="iframe-include.html"
width="100%" height="100"
sandbox="allow-scripts"></iframe>
<script type="text/javascript">
window.addEventListener('message', function (event) {
console.log(event);
}, false);
</script>
</body>
</html>
И мой контент iFrame
<html>
<body>
<h3>Inside</h3>
<script type="text/javascript">
var counter = 1,
domain = window.location.protocol + '//' + window.location.host,
send = function () {
window.setTimeout(function () {
console.log('iframe says:', domain);
window.parent.postMessage(counter, domain);
counter += 1;
send();
}, 3000);
};
send();
</script>
</body>
</html>
Глядя на консоль, свойство origin объекта события всегда равно null, даже если переменная домена в iFrame верна.
Моя консоль говорит:
iframe-include.html:11 iframe says: http://127.0.0.1:8181
iframe.html:11 MessageEvent {isTrusted: true, data: 2, origin: "null", lastEventId: "", source: Window…}
В каждом документе говорится, что важно проверить событие event.origin внутри прослушивателя событий сообщения. Но как это сделать, если оно всегда равно null?
Спасибо за помощь
Так как iframe изолирован песочницей, он потерял доступ к своим исходным данным.
добавление allow-same-origin
в свойство изолированной песочницы iframe заставит его работать снова.
Как указано здесь, в этом сценарии есть отличный способ определить отправителя без предоставления разрешения allow-same-origin
:
// Sandboxed iframes which lack the 'allow-same-origin'
// header have "null" rather than a valid origin. This means you still
// have to be careful about accepting data via the messaging API you
// create. Check that source, and validate those inputs!
var frame = document.getElementById('sandboxed');
if (e.origin === "null" && e.source === frame.contentWindow)
alert('Result: ' + e.data);
Обратите внимание, что источником является не null
, а "null"
.