2010-09-21 5 views
5

J'ai cherché pendant un certain temps et je ne trouve pas de réponse à mes besoins. J'ai une page qui ouvre une fenêtre (window.open), connecte l'utilisateur (crée un cookie, définit une session) puis redirige vers une autre page. Pendant que le modal redirige, je voudrais rafraîchir la page parente, ainsi toutes les bonnes choses que je viens de faire seront reconnues par le parent. J'ai essayé window.opener et des trucs comme ça. Quelqu'un peut-il m'aider un peu? MerciActualiser la fenêtre parent de la fenêtre enfant en javascript

+1

Vouliez-vous dire "Rafraîchir le parent du CHILD javascript"? J'aime le piment vert, étant du Nouveau-Mexique, mais je ne sais pas ce qu'est un piment dans ce contexte. –

+0

window.parent n'est-ce pas? 'window.parent.frames [0]' ou similaire https://developer.mozilla.org/en/DOM –

+0

window.opener est généralement ce que vous appellerez dans la fenêtre enfant. Pouvez-vous montrer votre script que vous utilisez pour ouvrir cette nouvelle fenêtre? –

Répondre

10

window.opener dans le popup fera référence à l'objet window de la fenêtre d'ouverture, alors bien sûr, vous devriez être en mesure d'appeler window.opener.location.reload();. Pourvu que vous ne soyez pas en conflit avec le Same Origin Policy, la fenêtre contextuelle peut appeler des scripts et manipuler des propriétés sur l'objet fenêtre parent, tout comme le code du parent.

Voici un live example qui montre l'appel de l'enfant à une fonction sur le parent et qui manipule directement le parent. Le code complet pour cela est cité ci-dessous.

Mais cet exemple n'a pas fait exactement ce que vous avez dit, donc j'ai done this one as well, qui a l'enfant rafraîchir la page parent via window.opener.location.reload().

code parent du premier exemple en direct:

<!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>​ 

(Vous n'avez pas ont d'utiliser une fonction de cadrage comme je l'ai fait ci-dessus, mais il est utile de garder vos globals contenues.)

code de l'enfant de premier exemple en direct:

<!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; (ou quelque chose de similaire à cela le fera)

+0

window.opener est peut-être mieux – automagic

1

Si aucune des autres suggestions ne fonctionne (N'oubliez pas de tester dans tous les principaux navigateurs), vous pouvez également essayer de transmettre explicitement une référence de la fenêtre parent à la fenêtre enfant. Parce que window.open() doit renvoyer une référence à la fenêtre enfant .. afin que vous puissiez faire child = window.open() et vous pouvez faire quelque chose comme child.myParent = window

+0

Très vrai. 'window.opener' est fiable sauf la SOP, et cela ira à l'encontre de la SOP, mais il est bon d'avoir des options. Vous devez faire un peu attention à la synchronisation, ce qui explique pourquoi je préfère que l'enfant appelle le parent. –

0

J'ai eu le même problème avec la présentation d'un formulaire dans un modal via ajax et besoin la page ci-dessous (parent page) pour recharger. window.location.reload(); a travaillé pour moi.

Questions connexes