Otwórz wyskakujące okienko i odśwież stronę nadrzędną po zamknięciu wyskakującego okienka

95

Otworzyłem wyskakujące okienko przez window.open w JavaScript, chcę odświeżyć stronę nadrzędną po zamknięciu tego wyskakującego okienka. (Zdarzenie onclose?) Jak mogę to zrobić?

window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
ArMaN
źródło
1
Sprawdź to: stackoverflow.com/questions/18321323/ ... może komuś pomóc
NoNaMe

Odpowiedzi:

233

Możesz uzyskać dostęp do okna nadrzędnego za pomocą ' window.opener ', więc napisz coś takiego w oknie potomnym:

<script>
    window.onunload = refreshParent;
    function refreshParent() {
        window.opener.location.reload();
    }
</script>
Morrison Cole
źródło
Nie znałem window.opener, dzięki! Okno wywołującego zawsze umieszczam w zmiennej w contentWindow dziecka. : - /
kay
3
Jeśli nie kontrolujesz JavaScript na stronie podrzędnej (np. Przepływ OAuth), będziesz musiał sprawdzić popupWindow.closedużywając rozwiązania setIntervaljak w @ Zuul.
jchook
34

W wyskakującym okienku nie ma żadnego zdarzenia zamknięcia, którego można by odsłuchać.

Z drugiej strony istnieje właściwość closed, która jest ustawiana na true, gdy okno zostanie zamknięte.

Możesz ustawić licznik czasu, aby sprawdzić tę zamkniętą właściwość i zrobić to w następujący sposób:

var win = window.open('foo.html', 'windowName',"width=200,height=200,scrollbars=no");   
var timer = setInterval(function() {   
    if(win.closed) {  
        clearInterval(timer);  
        alert('closed');  
    }  
}, 1000); 

Zobacz ten działający przykład Fiddle !

Zuul
źródło
1
nie chcę używać timera! jakikolwiek inny pomysł?
ArMaN
1
Trochę hackerskie, ale myślę, że używanie timera będzie działać najlepiej we wszystkich przeglądarkach.
kay
Jest to również najlepsze rozwiązanie, jeśli wyskakujące okienko ma kilka stron przed zamknięciem, ponieważ zdarzenie onunload jest wyzwalane dopiero po opuszczeniu przez użytkownika pierwszej strony.
AntonChanning
14

na swojej stronie podrzędnej umieść te:

<script type="text/javascript">
    function refreshAndClose() {
        window.opener.location.reload(true);
        window.close();
    }
</script>

i

<body onbeforeunload="refreshAndClose();">

ale jako dobry projekt interfejsu użytkownika powinieneś używać Close, buttonponieważ jest bardziej przyjazny dla użytkownika. zobacz kod poniżej.

<script type="text/javascript">
    $(document).ready(function () {
        $('#btn').click(function () {
            window.opener.location.reload(true);
            window.close();
        });
    });
</script>

<input type='button' id='btn' value='Close' />
Ray Cheng
źródło
kiedy wyskakujące okienko jest zamknięte, a nie gdy użytkownik kliknie przycisk, aby odświeżyć stronę i zamknąć wyskakujące okienko
gengkev
@gengkev, wiedziałem, że OP chce dołączyć zdarzenie do zamknięcia okna, ale uważam, że użycie przycisku to lepszy projekt interfejsu użytkownika. jednak dołączyłem kod dla obu. proszę doradź.
Ray Cheng
Użyłem <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> function refreshAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz
3

Używam tego:

<script language='javascript'>
var t;
function doLoad() {
t = setTimeout("window.close()",1000);
}

</script>
<script type="text/javascript">
function refreshAndClose() {
    window.opener.location.reload(true);
    window.close();
}
</script>
<body onbeforeunload="refreshAndClose();" onLoad='doLoad()''>

kiedy okno się zamyka, odświeża okno nadrzędne.

Patrick Kershner
źródło
2

window.open zwróci odniesienie do nowo utworzonego okna, pod warunkiem, że otwarty adres URL jest zgodny z zasadami tego samego pochodzenia .

To powinno działać:

function windowClose() {
    window.location.reload();
}

var foo = window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
foo.onbeforeunload= windowClose;​
Cranz
źródło
Nie będzie działać, jeśli użytkownik będzie mógł podążać za linkami w otwartym oknie. I jestem całkiem pewien, że zdarzenie unload jest generowane przed pierwszym załadowaniem docelowego adresu URL, ponieważ niejawnie zostawiasz about: puste. (+1 za wspomnienie SOP)
kay
2

W moim przypadku otworzyłem wyskakujące okienko po kliknięciu przycisku linku na stronie nadrzędnej. Aby odświeżyć rodzica po zamknięciu dziecka za pomocą

window.opener.location.reload();

w oknie dziecka spowodowało ponowne otwarcie okna podrzędnego (chyba ze względu na stan widoku. Popraw mnie, jeśli się mylę). Postanowiłem więc nie przeładowywać strony w rodzica i ponownie wczytywać stronę przypisując jej ten sam adres URL.

Aby uniknąć ponownego otwierania wyskakującego okienka po zamknięciu wyskakującego okienka, może to pomóc,

window.onunload = function(){
    window.opener.location = window.opener.location;};
Jitendra Sawant
źródło
1

Jeśli Twoja aplikacja działa w przeglądarce obsługującej HTML5. Możesz użyć postMessage . Podany tam przykład jest bardzo podobny do twojego.

Chris Li
źródło
„W przeciwnym razie nie będzie można komunikować się między różnymi oknami”. jest źle. Technika jest nadal możliwa, chociaż polecam odpowiedź od @Moses
gengkev
-1 usunięte. Jeśli podasz mały przykład, dostaniesz nawet +1 ;-)
kay
Nieważne. Ale nie sądzę, żeby window.opener było OK dla IE. Spróbuję.
Chris Li
1
@kay, działa świetnie w IE7, 8. Bardzo fajnie, wcześniej tego nie wiedziałem. +1 dla Mojżesza.
Chris Li
1
@ArMaN: jsfiddle.net/8c2e4/10 , użyj window.opener. Możesz użyć tego do przetestowania swojego środowiska.
Chris Li
1

Spróbuj tego

        self.opener.location.reload(); 

Otwórz element nadrzędny bieżącego okna i ponownie załaduj lokalizację.

nmkyuppie
źródło
0

Możesz wejść na stronę główną za pomocą polecenia rodzica (rodzic jest oknem) po kroku możesz zrobić wszystko ...

    function funcx() {
        var result = confirm('bla bla bla.!');
        if(result)
            //parent.location.assign("http://localhost:58250/Ekocc/" + document.getElementById('hdnLink').value + "");
            parent.location.assign("http://blabla.com/" + document.getElementById('hdnLink').value + "");
    } 
Hamit YILDIRIM
źródło
0

Możesz użyć poniższego kodu na stronie nadrzędnej.

<script>
    window.onunload = refreshParent;
    function refreshParent() {
      window.opener.location.reload();
    }
</script>
muqofa
źródło
0

Poniższy kod pozwoli odświeżyć zamknięcie okna nadrzędnego:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
UJS
źródło