La forma correcta de manejar el cierre de ventana emergente

Estoy buscando evento cercano para ventana emergente. Encontré uno para XUL , pero lo necesito para HTML.

Popup ha closed propiedad.

 >>> var popup = open('http://example.com/', 'popup', 'height=400,width=500'); >>> popup.closed false 

Bueno, puedo verificarlo una vez a medio segundo .

 function open_popup() { var popup = open('http://example.com/', 'popup', 'height=450,width=450'); var timer = setInterval(function(){ if (popup.closed) { alert('popup closed!'); clearInterval(timer); } }, 500); } 

Lo probé en Chrome 4.0.249.27, Opera 10.10, Safari 4.0.4 y Firefox 3.5.5. Todo funciona bien

Pero setInterval me molesta. Es feo ¿Hay una mejor manera de hacer esto?

ACTUALIZACIÓN: uso ventanas emergentes para el diálogo de autenticación (oAuth, en realidad). Quiero enviar algunos datos a la ventana principal después de cerrar la ventana emergente (a través de postMessage).

Página dentro de ventana emergente de otro dominio. Por lo tanto, no puedo agregar ningún evento ( unload ) debido a restricciones de seguridad.

No puedo usar iframe debido a script de iframe buster. Por lo tanto, no puedo usar ningún diálogo modal elegante de jQuery.

No puedo editar nada dentro de ventana emergente.

Es posible que desee buscar en el evento de unload , eche un vistazo a Javascript: ventanas emergentes

editar : como dijiste, no puedes editar nada dentro del menú emergente, realmente no hay opciones disponibles. Creo que su código setInterval actual hace el trabajo bien. Debería preguntarse si la detección en tiempo real del cierre de ventana emergente es absolutamente crítica. Ese temporizador de 500 milisegundos ciertamente no forzará casi ningún recurso ni hará que alguien se arrodille.

He usado jQuery Dialog y tiene un evento cercano

http://jqueryui.com/demos/dialog/ .

No estoy seguro si entiendo bien tu pregunta, ¿por qué quieres usar el temporizador?

Use window.opener en la ventana emergente. es decir algo como:

 onunload = opener.alert('popup closed'); 

o

 onunload = opener.nameOfAFunction();