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.