Определить, когда iframe является междоменным, а затем выйти из него - PullRequest
12 голосов
/ 02 марта 2010

У меня есть страница с большим iframe, которая содержит большую часть контента. Пользователь взаимодействует с веб-сайтом, щелкая внутри фрейма. Функциональность, которую я пытаюсь создать, такова: когда пользователь уходит с моего сайта, я делаю ему одолжение и выхожу из iframe.

У iframe есть событие onload, которое запускается каждый раз, когда загружается новая страница, междоменная или нет.

<iframe id="testframe" src="http://mysite.com" onload="testframe_loaded()"></iframe>

Каждый раз, когда происходит событие, я ищу какой-то способ:

A ) Определить, когда пользователь переходит на другой домен

B ) Вылет из фрейма.

Я подозреваю, что B невозможно, так как браузеры не предоставляют доступ к

document.getElementById("testframe").contentDocument.location.href

когда iframe является междоменным. Я также не уверен, возможно ли или нет А.

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 02 марта 2010

Вы можете сделать A, так как если вы получаете ошибку безопасности (которую вы можете поймать), это означает, что они междоменные :) Тогда вы можете изменить размер iframe, чтобы он составлял всю страницу. Но я думаю, что вы правы, вы не можете на самом деле вырваться без явного сотрудничества с другим доменом.

РЕДАКТИРОВАТЬ: Вы правы, вам не нужно опрашивать. Вот основной код:

<html>
<head>
<title>Cross-domain frame test</title>
<!-- /1998953/opredelit-kogda-iframe-yavlyaetsya-mezhdomennym-a-zatem-vyiti-iz-nego -->
<script type="text/javascript">
function checkForCross()
{
  var iframe = document.getElementById("myFrame");
  try
  {
    var loc = iframe.contentDocument.location.href;
  } catch(e)
  {
    iframe.setAttribute("style", "border: 0; margin: 0; padding: 0; height: 100%; width: 100%;");
  }
}
</script>
</head>
<body>
<iframe name="myFrame" id="myFrame" src="child.html" style="height: 50%; width: 50%;" onload="checkForCross()"></iframe>
</body>
</html>
2 голосов
/ 02 марта 2010

установить атрибут 'target' на внешних ссылках равным _top.

1 голос
/ 31 июля 2012

Это работает как минимум для Chrome (не тестер в других браузерах)

   if(parent.location.host != undefined){ 
       alert("hello world!");
    }else{
       throw "cannot access parent!";
    }

Он все равно выдаст предупреждение "unsafe javascript attempt", но это не остановит выполнение кода. Вместо этого переменная возвращается как неопределенная.

...