2010-09-21 2 views
5

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

+1

Возможно, вы имели в виду «Обновить родителя из javascript CHILD»? Мне нравится зеленый чили, из Нью-Мексико, но я не знаю, что такое чили в этом контексте. –

+0

window.parent не так ли? 'window.parent.frames [0]' или аналогичный https://developer.mozilla.org/en/DOM –

+0

window.opener, как правило, вы вызываете дочернее окно. Можете ли вы показать свой скрипт, который вы используете, чтобы открыть это новое окно? –

ответ

10

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

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

Но этот пример не делать точно, что вы сказали, так что я имею done this one as well, которая имеет ребенка освежающий родительскую страницу с помощью 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

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

+0

window.opener, возможно, лучше – automagic

1

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

+0

Очень верно. 'window.opener' является надежным, запрещающим SOP, и это тоже будет работать в SOP, но полезно иметь опции. Вы должны иметь дело с временными настройками, что является частью того, почему я предпочитаю, чтобы ребенок вызывал родителя. –

0

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