2010-07-20 8 views
53

Die Frage ist so ziemlich alles im Titel.ist es möglich, ein Popup mit Javascript zu öffnen und dann zu erkennen, wenn der Benutzer es schließt?

Ist es möglich (und wie?), Ein Popup mit Javascript zu öffnen und dann zu erkennen, wenn der Benutzer es schließt?

Ich benutze jquery innerhalb des Projekts, so dass eine jquery Lösung gut wäre. Prost!

+0

ein Popup-Browser? – Reigel

+0

definieren "Pop-up". Sprechen wir eine Art von auf der Seite gerenderten modalen Kasten? Ein JavaScript-Alarm? Ein neues Browserfenster? –

+1

Ein neues Browserfenster ... sorry für meinen Mangel an Klarheit – Pablo

Antwort

81

Wenn Sie die Kontrolle über den Inhalt des Pop-up haben, die dort unload Veranstaltung Fenstergriff und das ursprüngliche Fenster über die opener Eigenschaft benachrichtigen , zuerst prüfen, ob der Öffner geschlossen wurde. Beachten Sie, dass dies nicht immer in Opera funktioniert.

window.onunload = function() { 
    var win = window.opener; 
    if (!win.closed) { 
     win.someFunctionToCallWhenPopUpCloses(); 
    } 
}; 

Da das unload Ereignis ausgelöst wird, wenn der Benutzer von der Seite in dem Pop-up und nicht nur navigiert weg, wenn das Fenster geschlossen ist, sollten Sie überprüfen, dass das Pop-up in someFunctionToCallWhenPopUpCloses tatsächlich geschlossen hat:

var popUp = window.open("popup.html", "thePopUp", ""); 
function someFunctionToCallWhenPopUpCloses() { 
    window.setTimeout(function() { 
     if (popUp.closed) { 
      alert("Pop-up definitely closed"); 
     } 
    }, 1); 
} 

wenn Sie die Kontrolle über den Inhalt des Pop-up nicht haben, oder wenn einer Ihres Ziel Browser das unload Ereignis nicht unterstützt, sind Sie im Hauptfenster zu irgendeiner Art von Polling Lösung reduziert . Passen Sie das Intervall entsprechend an.

var win = window.open("popup.html", "thePopUp", ""); 
var pollTimer = window.setInterval(function() { 
    if (win.closed !== false) { // !== is required for compatibility with Opera 
     window.clearInterval(pollTimer); 
     someFunctionToCallWhenPopUpCloses(); 
    } 
}, 200); 
+2

Ich empfehle die Polling-Lösung anstelle des 'unload'-Ereignisses, da es mit mehr Browsern kompatibel ist (siehe https://opera-bugs.jottit.com/). –

+0

@ JonathonHill: Einverstanden. Ich habe schon früher in der Antwort auf das Opera-Problem angespielt, aber ich hätte das deutlicher machen sollen. Danke für die Bearbeitung. Übrigens, warum muss man in Opera 'window.closed! == false'? –

+0

Es ist eine Problemumgehung für einen Fehler in Opera. Ich habe es von https://opera-bugs.jottit.com/ entdeckt. –

0

Der einzige Weg, an den ich im Moment denken kann, ist eine Funktion auf Ihrer Elternseite zu erstellen, die ein Timeout enthält, das sich nach 10 Sekunden selbst aufruft. In der Funktion können Sie auch nach dem Wert eines Cookies suchen, um zu sehen, ob es wahr oder falsch ist. Wenn das Popup-Fenster geschlossen wird, setzen Sie ein Cookie auf true.

Hoffe, das hilft.

+0

Ignoriere dies. AJM's Weg ist viel einfacher. + rep –

4

Versuchen Sie, in die Fensterereignisse unload und beforeunload zu schauen. diese Überwachung sollen Ihnen die Möglichkeit geben, zurück zu rufen, wenn das DOM entlädt, wenn das Fenster über so etwas wie diese geschlossen ist:

var newWin = window.open('/some/url'); 
newWin.onunload = function(){ 
    // DOM unloaded, so the window is likely closed. 
} 
+0

Dank ajm sieht gut aus. Gibt es trotzdem eine Möglichkeit, die URL eines Popups zu erhalten? – Pablo

+0

Dies funktioniert nicht über den Browser. Sie müssen das'Entlade' -Ereignis im Popup-Fenster behandeln. –

+0

Entladen wird mit jeder neuen Anforderung ausgelöst, nicht nur wenn das Fenster geschlossen wird. –

5

Wenn Sie die jQuery UI Dialog verwenden können, es hat tatsächlich ein close Ereignis.

+8

jQuery ist nicht die Lösung für jedes Problem :). – s4y

+10

Wahr, wahr. Ich hätte meine Antwort mit dem Wort "if" beginnen sollen, wie in "Wenn Sie den jQuery UI Dialog verwenden können" und nicht nur * angenommen * es war möglich. Hallo! Warten Sie eine Sekunde ... – eje211

+3

Und wenn es um JavaScript geht, ist jQuery nie wirklich eine Lösung für Probleme, aber es ist oft eine riesige, RIESIGE ** HUGE ** Abkürzung für die Lösung, was auch immer es sein mag. Sie lernen mehr, indem Sie die landschaftliche Route nehmen, aber in vielen Fällen bevorzugen ich und die meisten Leute die (riesige, riesige, ** riesige **) jQuery Abkürzung. – eje211

0

Ja, behandeln Sie das Onbeforeunload Ereignis für das Popup-Fenster und dann eine Funktion auf dem übergeordneten Fenster aufrufen mit:

window.opener.myFunction() 
3

Um ein neues Fenster Anruf zu öffnen:

var wnd = window.open("file.html", "youruniqueid", "width=400, height=300"); 

Wenn Sie nur wollen Um zu wissen, wann dieses Fenster geschlossen wird, verwenden Sie onunload.

wnd.onunload = function(){ 
    // do something 
}; 

Wenn Sie eine Bestätigung vom Benutzer möchten, bevor die es schließen können, verwenden onbeforeunload.

wnd.onbeforeunload = function(){ 
    return "are you sure?"; 
}; 
+1

Dies funktioniert nicht über den Browser. Sie müssen das 'unload' -Ereignis im Popup-Dokument behandeln. –

+0

Entladen wird mit jeder neuen Anforderung ausgelöst, nicht nur wenn das Fenster geschlossen wird. –

3

Wir tun dies in einem meiner Projekte bei der Arbeit.

Der Trick besteht darin, eine JS-Funktion in Ihrer übergeordneten Seite zu haben, die Sie aufrufen möchten, wenn das Popup geschlossen wird, und dann das Entladeereignis im Popup anzuhängen.

Die Eigenschaft window.opener bezieht sich auf die Seite, die dieses Popup hervorgebracht hat.

Zum Beispiel, wenn ich eine Funktion namens callingPageFunction auf meiner ursprünglichen Seite schrieb, würde ich es aus dem Popup wie folgt aufrufen:

$(window).unload(function() { 
    window.opener.callingPageFunction() 
}); 

Zwei Anmerkungen:

  1. Dies sollte in gewickelt werden eine fertige Funktion.
  2. Ich habe eine anonyme Funktion, weil Sie eine andere Logik in möchten kann es
2

Es gibt eine sehr einfache Lösung für Ihr Problem.

zunächst ein neues Objekt machen, die ein Pop wie diese eröffnen wird:

var winObj = window.open('http://www.google.com','google','width=800,height=600,status=0,toolbar=0'); 

Um zu wissen, wenn dieses Popup-Fenster geschlossen ist, man muss nur mit einer Schleife überprüft diese halten wie folgt aus:

var loop = setInterval(function() { 
    if(winObj.closed) { 
     clearInterval(loop); 
     alert('closed'); 
    } 
}, 1000); 

Jetzt können Sie Alert mit beliebigem JavaScript-Code ersetzen.

Viel Spaß! :)

Verwandte Themen