Уже был жемчуг один, но это - пара символов короче (9 по сравнению с 12) - и это не рекурсивно вызывает:)
с//* _ = 0/e
Хорошо, я провел дополнительное исследование, и оказалось, что postMessage работает во всех современных браузерах, даже в IE (с оговоркой, что IE имеет несколько иной способ сделать это). Вот как я заставил его работать (проверено на WinXP в IE8, FF3.5, Chrome 3.0, Safari 4 beta, Opera 9.64):
<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>
<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>
Нет, и не зря. Если вам это нужно, вы должны запустить все коммуникации через один из двух серверов; например, пусть server1 действует как прокси для всех запросов на «server2 / test2.html».
Если и родительский, и iframe находятся на поддоменах одного домена, вы можете что-то сделать с помощью свойства document.domain
. Если и тело, и iframe считаются происходящими из одного и того же источника, изменение местоположения должно быть возможным; Я сам не пробовал. Некоторое чтение здесь
Если кадры находятся в одном домене, у вас должен быть доступ к родительскому кадру. В противном случае - нет, это проблема безопасности.
Единственный обходной путь, который приходит на ум, - это использовать AJAX для обновления файла на каждом из серверов, а затем проверить содержимое противоположного файлового сервера. Вы можете сделать то же самое, используя единую базу данных, если вы разрешите подключения из внешних доменов.
Это все излишне, когда вы можете просто вывести ссылку во фрейме и попросить пользователей щелкнуть по ней, чтобы продолжить .