Изменение URL родительского окна от IFrame

Уже был жемчуг один, но это - пара символов короче (9 по сравнению с 12) - и это не рекурсивно вызывает:)

с//* _ = 0/e

14
задан Community 23 May 2017 в 12:31
поделиться

4 ответа

Хорошо, я провел дополнительное исследование, и оказалось, что postMessage работает во всех современных браузерах, даже в IE (с оговоркой, что IE имеет несколько иной способ сделать это). Вот как я заставил его работать (проверено на WinXP в IE8, FF3.5, Chrome 3.0, Safari 4 beta, Opera 9.64):

server1 / test.html

<html>
<head>
<script type="text/javascript">
if(navigator.appName == "Microsoft Internet Explorer")
  window.attachEvent("onmessage", receiveMessage);
else
  window.addEventListener("message", receiveMessage, false);

function receiveMessage(e) {
  if(e.origin == "http://server2") //important for security
    if(e.data.indexOf('redirect:') == 0)
      document.location = e.data.substr(9);
}
</script>
</head>
<body>
<iframe src="http://server2/test2.htm" width="400" height="150"></iframe>
</body>
</html>

server2 / test2.htm

<html><body>
<script>
function clickit() {
  parent.postMessage('redirect:http://www.google.com', 'http://server1');
}
</script>
<p>This should be in an iFrame!</p>
<p><a href="http://www.google.com" target="_parent">normal link</a></p>
<p><a href="javascript:clickit()">javascript link</a></p>
</body></html>
13
ответ дан 1 December 2019 в 12:52
поделиться

Нет, и не зря. Если вам это нужно, вы должны запустить все коммуникации через один из двух серверов; например, пусть server1 действует как прокси для всех запросов на «server2 / test2.html».

2
ответ дан 1 December 2019 в 12:52
поделиться

Если и родительский, и iframe находятся на поддоменах одного домена, вы можете что-то сделать с помощью свойства document.domain . Если и тело, и iframe считаются происходящими из одного и того же источника, изменение местоположения должно быть возможным; Я сам не пробовал. Некоторое чтение здесь

1
ответ дан 1 December 2019 в 12:52
поделиться

Если кадры находятся в одном домене, у вас должен быть доступ к родительскому кадру. В противном случае - нет, это проблема безопасности.

Единственный обходной путь, который приходит на ум, - это использовать AJAX для обновления файла на каждом из серверов, а затем проверить содержимое противоположного файлового сервера. Вы можете сделать то же самое, используя единую базу данных, если вы разрешите подключения из внешних доменов.

Это все излишне, когда вы можете просто вывести ссылку во фрейме и попросить пользователей щелкнуть по ней, чтобы продолжить .

0
ответ дан 1 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

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