HTML5 междоменная связь не работает
Я открываю 1.htm как http://127.0.0.1/1.html
1.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<iframe id="ifr" src="http://localhost/2.html" width="100%" height="300">
</iframe>
<script>
iframe=document.getElementById("ifr");
iframe.contentWindow.postMessage("hello there", "http://localhost");
</script>
</body>
</html>
2.html
<!DOCTYPE html>
<html>
<head>
<script>
window.addEventListener("message", function(event) {
alert(hi);
if (event.data === "hello there" ) {
alert("Hi" + event.origin);
}
}, false );
</script>
<head>
<body>
Hello world
</body>
"
but I have that error: "Unable to post message to http://localhost. Recipient has origin http://127.0.0.1/
это простой пример. наконец, мне нужна такая структура: в домене "A" у меня есть iframe, и это src - страница домена "B". в iframe есть кнопка. Когда я нажимаю на эту кнопку, которая отображается внутри iframe, мне нужно вызвать window.addEventListener домена "A", как я могу это сделать?
3 ответа
Как описано здесь. у вас есть только следующие варианты.
Связь между одинаковыми или разными доменными сценариями:
+-------------------------+-----------+-------------+-------------+
| | home.html | framed.html | helper.html |
+-------------------------+-----------+-------------+-------------+
| www.foo.com/home.html | N/A | YES | YES |
| www.bar.net/framed.html | NO | N/A | YES |
| www.foo.com/helper.html | YES | YES | N/A |
+-------------------------+-----------+-------------+-------------+
Это чисто браузерное ограничение для атаки CSRF (Cross Site Request Forgery). Глядя на ваш сценарий, даже вы работаете в одном домене. Один из вариантов - следовать приведенному выше примеру иерархии, где вы можете передавать сообщения между страницами, даже в пределах одного или разных доменов, используя вспомогательную страницу на родительском сайте. Затем ребенок может принимать и отправлять сообщения через эту страницу помощника.
Решено этим:
<iframe id="frameId" src="http://b.net/2.html" onload="sendCommand();"> No Frame!</iframe>
<script type="text/javascript">
function sendCommand() {
var receiver;
receiver = document.getElementById('frameId').contentWindow;
receiver.postMessage(receiver, 'http://b.net');
}
</script>
Проверьте файл хоста (C:\Windows\System32\drivers\etc) и убедитесь, что у вас нет сопоставленного localhost, как ничего другого.
Обратите внимание, что доступ к родительскому фрейму от дочернего элемента через Javascript не работает так, как это создает проблему безопасности (межсайтовый скриптинг).