Доступ к родительскому окну из iframe (междоменный) - PullRequest
10 голосов
/ 20 марта 2012

Я столкнулся с задачей доступа к родительскому окну из iFrame, если окно в iFrame было загружено из другого домена. Если я правильно понимаю, все современные браузеры позволяют это делать. Так что я здесь, чтобы найти лучшее решение.

Я собираюсь сделать это следующим образом:

У меня есть оверлей с iFrame внутри. Это будет работать вместо всплывающих окон, чтобы блокировщики всплывающих окон не блокировали мой контент. Задача состоит в том, чтобы перезагрузить главную страницу, когда документ в iFrame завершает некоторую работу. В документ, который будет загружен в iFrame, я добавлю

<div id="is_closed" class="false"></div>

В родительское окно я добавлю функцию, которая будет вызываться каждую секунду, и проверю, имеет ли этот div имя класса «false». Когда это изменится на «true», я буду вызывать несколько обратных вызовов.

Если у вас есть лучшее решение, поделитесь им со мной. Буду признателен за любую помощь.

Редактировать : Это невозможно, поскольку не только невозможно управлять родительским окном из дочернего окна, но и наоборот. Моя идея состояла в том, чтобы манипулировать дочерним окном из родительского окна. Я был неправ.

Ответы [ 5 ]

41 голосов
/ 10 сентября 2013

На вашем месте я бы проверил window.postMessage. Может делать что хочешь:

Для справки см. Следующее:

12 голосов
/ 20 марта 2012

Если я правильно понимаю, все современные браузеры теперь позволяют это делать. Так что я здесь, чтобы найти лучшее решение.

Это является вашим решением. То, что вы спрашиваете, невозможно.

Смотрите похожие вопросы:

EDIT

Как упомянуто в комментариях ниже, @ JeremysAwesome ответ предлагает метод, который разрешает междоменные запросы при определенных обстоятельствах. См. Вопрос SO ниже для получения дополнительной информации.

Способы обхода политики одного и того же происхождения

7 голосов
/ 19 июля 2013

, но вы можете изменить атрибут src iframe (например, добавив #hashtag) и прослушать событие onhashchange в дочернем окне. Учитывая, что вы можете изменить обе страницы.

0 голосов
/ 05 мая 2019

другим способом будет: установка iframes src на javascript: ссылку через 500 миллисекунд после загрузки. Пример:

setTimeout(function() {
  document.getElementsByTagName("iframe")[0].src = `javascript: 
      (function(){
          setInterval(function() {
          if (document.getElementById("is_closed").className.match(/true/g)) {
              ...//see @jeremysawesome on how to do window.postMessage
          }
      })()`
}, 500);

Хотя ответ @jeremysawesome сработал, он будет работать на встроенном фрейме независимо от домена хоста, но это замечательно при работе с веб-сайтами, размещенными на таких доменах, как blogspot.com, которые не позволяют изменять этот тип содержания легко ...

Теперь, очевидно, вам все еще нужно запустить window.postMessage, более подробную информацию об этом можно найти в ответе @ jeremysawesome

0 голосов
/ 05 декабря 2016

установить переменную / элемент в sessionStorage и использовать его с обеих сторон, как вы хотите. localStorage может делать это дольше.

угроза безопасности - кто-то использует и манипулирует этим, чтобы захватить вашу сторону. НО, если кто-то захочет сделать это - всегда будет возможность.

Помните: жизнь находит путь ...; -)

...