Подтвердить что ты не робот

Обнаруживать, когда iframe является междоменным, а затем выкидывать из него

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

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

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

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

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

B) Бюст из iframe.

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

EDIT: Вы правы, вам не нужно опроса. Вот базовый код:

<html>
<head>
<title>Cross-domain frame test</title>
<!-- http://stackoverflow.com/questions/2365822/detect-when-iframe-is-cross-domain-then-bust-out-of-it/2365853#2365853 -->
<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

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

Ответ 3

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

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

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