Обновите родительское окно из дочернего окна в JavaScript - PullRequest
5 голосов
/ 21 сентября 2010

Я долго искал и не могу найти ответ, который соответствует моим потребностям.У меня есть страница, которая открывает окно (window.open), регистрирует пользователя (создает файл cookie, устанавливает сеанс), а затем перенаправляет на другую страницу.Пока модал перенаправляет, я бы хотел обновить родительскую страницу, чтобы все хорошее, что я только что сделал, было распознано родителем.Я пробовал window.opener и все в таком духе.Может кто-нибудь помочь мне немного?Спасибо

Ответы [ 4 ]

10 голосов
/ 21 сентября 2010

window.opener во всплывающем окне будет ссылаться на объект window открывающегося окна, поэтому, конечно, вы сможете вызвать window.opener.location.reload();. При условии, что вы не нарушаете политику Same Origin * , всплывающее окно может вызывать сценарии и манипулировать свойствами объекта родительского окна так же, как код в родительском окне.

Вот живой пример , демонстрирующий дочерний процесс, вызывающий функцию у родителя, а также непосредственно манипулирующий родителем. Полный код этого приведен ниже.

Но этот пример не выполнил точно того, что вы сказали, поэтому я также сделал это , когда ребенок обновляет родительскую страницу через window.opener.location.reload().

Родительский код первого живого примера:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Parent Window</title>
<!--[if IE]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<style>
  article, aside, figure, footer, header, hgroup, 
  menu, nav, section { display: block; }
</style>
</head>
<body>
  <input type='button' id='btnOpen' value='Open Window'>
  <div id='display'></div>
</body>
<script type='text/javascript'>
  (function() {
    var btnOpen = document.getElementById('btnOpen');
    btnOpen.onclick = btnOpenClick;

    function btnOpenClick() {
      window.open('http://jsbin.com/ehupo4/2');
    }

    // Make the callback function available on our
    // `window` object. I'm doing this explicitly
    // here because I prefer to export any globals
    // I'm going to create explicitly, but if you
    // just declare a function in a script block
    // and *not* inside another function, that will
    // automatically become a property of `window`
    window.callback = childCallback;
    function childCallback() {
      document.getElementById('display').innerHTML =
          'Got callback from child window at ' + new Date();
    }
  })();
</script>
</html>​

(У вас нет , чтобы использовать функцию определения области действия, как я делал выше, но полезно хранить глобальные переменные.)

Дочерний код первого живого примера:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Child Window</title>
<!--[if IE]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<style>
  article, aside, figure, footer, header, hgroup, 
  menu, nav, section { display: block; }
</style>
</head>
<body>
  <p>I'm the child window</p>
</body>
<script type='text/javascript'>
  if (window.opener) {
    // Call the provided callback
    window.opener.callback();

    // Do something directly
    var p = window.opener.document.createElement('p');
    p.innerHTML = "I was added by the child directly.";
    window.opener.document.body.appendChild(p);
  }
</script>
</html>​
1 голос
/ 21 сентября 2010

Если ни одно из других предложений не работает (не забудьте протестировать во всех основных браузерах), вы также можете попробовать явно передать ссылку на родительское окно в дочернее окно. Потому что window.open() должен возвращать ссылку на дочернее окно .. так что вы можете сделать child = window.open(), а затем вы можете сделать что-то вроде child.myParent = window

1 голос
/ 21 сентября 2010

window.parent.top.location = window.parent.top.location; (или что-то похожее на это сделает)

0 голосов
/ 10 апреля 2015

У меня была такая же проблема с отправкой формы через модал через ajax, и мне нужна страница внизу (родительская страница) для перезагрузки. window.location.reload(); работал на меня.

...