Можно ли повторно использовать всплывающее окно в JavaScript после перехода в другое место в родительском? - PullRequest
2 голосов
/ 10 августа 2011

Предположим, у нас есть веб-сайт, на котором вы нажимаете кнопку, и который открывает всплывающее (дочернее) окно с использованием JavaScript. Итак, давайте назовем родителя A и всплывающее окно P . В источнике A мы увидим что-то вроде этого:

<script type="text/javascript">
P = window.open('P.html', 'P');
</script>

Так что, пока A открыт, мы можем взаимодействовать с P в JavaScript с помощью переменной P. Однако, когда я нажимаю на ссылку в A , чтобы перейти к B.html, я теряю все переменные. Тем не менее, мое всплывающее окно все еще открыто, поэтому мне интересно, есть ли способ связать их вместе. Можно ли каким-либо образом манипулировать P изнутри B ? Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

Ну, я понял, что, к моему приятному удивлению, ответ ДА.Решение Мухаммеда об использовании window.top было неверным;когда я пытаюсь получить доступ к window.top из P , это просто возвращает ссылку на P .Ответ РобГа просто упустил из виду.

Я обнаружил, что если я делаю это периодически изнутри P , все работает:

<!-- A.html, B.html -->
<script type="text/javascript">
function setP(ref)
{
    P = ref;
}
</script>

<!-- P.html -->
<script type="text/javascript">
function updateParent()
{
    if ( typeof window.opener.setP == 'function' ) {
        window.opener.setP(window);
    }
}
window.setInterval(updateParent, 2000);
</script>

Таким образом, даже когдаЯ перемещаюсь по родительскому окну с A до B , B , и все равно будет обновляться со ссылкой на окно P , и как только это будет установлено,после этого два окна снова могут свободно общаться друг с другом.

1 голос
/ 10 августа 2011

Окно может получить доступ к дочерним окнам, которые оно открывает, а дочерние окна могут получить доступ к их окну открывания.Если одно из окон переходит на новый URI в другом домене, их содержимое больше не доступно для другого.

например,

Окно открывания HTML:

<title>Opener window</title>
<script type="text/javascript">

var popWin = (function() {

  var win;

  return {
    open: function() {
      if (!win || win.closed) {
        win = window.open('','child');
        win.document.write(
          '<title>Child window<\/title>' +
          '<script type="text/javascript" src="popWin.js"><\/script>' +
          '<h1>popWin<\/h1>'
        );
      }
      win.document.close();
    },

    close: function() {
      win && win.close();
      win = null;
    }
  };

}());

</script>
<button onclick="popWin.open();">Open child</button>

popWin.js:

window.onload = function() {
   var button = document.createElement('button');
   button.onclick = function() {
     try {
       alert(window.opener.document.title);
     } catch (e) {
       alert('Access to opener failed with error:\n\n' + e.message);
     }
   };
   button.appendChild(document.createTextNode('Check opener'));
   document.body.appendChild(button);
};

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

Permission denied to access property 'document'
0 голосов
/ 10 августа 2011

, если всплывающее окно является самым верхним окном, вы можете использовать window.top для доступа к нему изнутри B, вот ссылка с более подробной информацией window.top

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...