Açılır pencereyi aç ve kapat açılır pencerede ana sayfayı yenile


95

JavaScript'te window.open tarafından bir popup pencere açtım, bu popup penceresini kapattığımda ana sayfayı yenilemek istiyorum. (Onclose olayı?) Bunu nasıl yapabilirim?

window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");

1
Lütfen şunu kontrol edin: stackoverflow.com/questions/18321323/… birine yardımcı olabilir
NoNaMe

Yanıtlar:


233

Ana pencereye ' window.opener ' kullanarak erişebilirsiniz , bu nedenle alt pencerede aşağıdakine benzer bir şey yazın:

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

Window.opener'ı bilmiyordum, teşekkürler! Arayan penceresini her zaman çocuğun contentWindow'daki bir değişkene koyarım. : - /
kay

3
Alt sayfada JavaScript'i kontrol etmiyorsanız (örn. OAuth akışı) , @ Zuul çözümündeki gibi popupWindow.closedkullanmayı kontrol etmeniz gerekecektir setInterval.
jchook

34

Açılır pencerede dinleyebileceğiniz herhangi bir kapanış etkinliği yoktur.

Öte yandan, pencere kapatıldığında true olarak ayarlanmış bir kapalı özellik vardır.

Kapalı özelliği kontrol etmek için bir zamanlayıcı ayarlayabilir ve şu şekilde yapabilirsiniz:

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

Bu çalışan Fiddle örneğine bakın !


1
zamanlayıcı kullanmak istemiyorum! başka bir fikir?
ArMaN

1
Biraz hack olsada, bir zamanlayıcı kullanmanın tüm tarayıcılarda en iyi sonucu vereceğini düşünüyorum.
kan

Bu aynı zamanda, açılır pencerenin kapanmadan önce birkaç sayfası varsa en iyi çözümdür, çünkü onunload olayı yalnızca kullanıcı ilk sayfadan ayrıldıktan sonra tetiklenir.
AntonChanning

14

alt sayfanıza şunları koyun:

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

ve

<body onbeforeunload="refreshAndClose();">

ancak iyi bir UI tasarımı olarak, buttondaha kullanıcı dostu olduğu için Close kullanmalısınız . aşağıdaki koda bakın.

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

açılır pencere kapatıldığında, kullanıcı sayfayı yenilemek ve açılır pencereyi kapatmak için bir düğmeyi tıkladığında değil
gengkev

@gengkev, OP'nin etkinliği pencere kapağına eklemek istediğini biliyordum, ancak bir düğme kullanmanın daha iyi bir UI tasarımı olduğuna inanıyorum. ancak her ikisi için de kod ekledim. tavsiye lütfen.
Ray Cheng

<Body onbeforeunload = "renewAndClose ();"> <script type = "text / javascript"> işlev yenilemeAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz

3

Bunu kullanıyorum:

<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()''>

pencere kapandığında ana pencereyi yeniler.


2

window.open, açılan URL'nin Aynı Kaynak Politikasına uygun olması koşuluyla, yeni oluşturulan pencereye bir referans döndürür .

Bu çalışmalı:

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

var foo = window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
foo.onbeforeunload= windowClose;​

Kullanıcı, açılan penceredeki bağlantıları takip edebilecekse çalışmaz. Ve dolaylı olarak about: blank bıraktığınız için, hedef URL ilk yüklenmeden önce bir boşaltma olayının atıldığından oldukça eminim. (SOP'den bahsedildiği için +1)
kay

2

Benim durumumda, ana sayfadaki bağlantı düğmesine tıklandığında bir açılır pencere açtım. Kullanarak çocuğu kapatırken ebeveyni yenilemek için

window.opener.location.reload();

çocuk pencerede alt pencerenin yeniden açılmasına neden oldu (Sanırım Görünüm Durumu nedeniyle olabilir. Yanlışsam düzeltin). Bu yüzden üst sayfadaki sayfayı yeniden yüklememeye ve sayfayı aynı url'yi ona atayarak tekrar yüklememeye karar verdim.

Açılır pencereyi kapattıktan sonra tekrar açılır pencerenin açılmasını önlemek için bu yardımcı olabilir,

window.onunload = function(){
    window.opener.location = window.opener.location;};

1

Uygulamanız HTML5 özellikli bir tarayıcıda çalışıyorsa. PostMessage'ı kullanabilirsiniz . Orada verilen örnek, sizinkine oldukça benzer.


"Aksi takdirde, farklı pencereler arasında iletişim kuramazsınız." Hata. @
Musa'dan

-1 kaldırıldı. Küçük bir örnek verirseniz +1 ;-) bile elde edersiniz
kay

Boşver. Ama window.opener'ın IE için uygun olduğunu düşünmüyorum. Bir deneyeceğim.
Chris Li

1
@kay, IE7'de harika çalışıyor, 8. Çok güzel, daha önce bilmiyordum. Musa için +1.
Chris Li

1
@ArMaN: jsfiddle.net/8c2e4/10 , window.opener kullanın. Ortamınızı test etmek için bunu kullanabilirsiniz.
Chris Li

1

Bunu dene

        self.opener.location.reload(); 

Mevcut bir pencerenin üst öğesini açın ve konumu yeniden yükleyin.


0

Ana sayfaya ebeveyn komutu ile ulaşabilirsiniz (ebeveyn penceredir) adımdan sonra her şeyi yapabilirsiniz ...

    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

Aşağıdaki kodu üst sayfada kullanabilirsiniz.

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

0

Aşağıdaki kod, kapanış sonrası ana pencere yenilenmesini yönetecek:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.