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


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>

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 !


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' />

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.


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

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;};

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.


„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ę.


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 + "");
    } 

0

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

<script>
    window.onunload = refreshParent;
    function refreshParent() {
      window.opener.location.reload();
    }
</script>

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();
                }
            };
        }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.