Recientemente encontré un error extraño (?) Al intentar manejar una ventana externa abierta a través de Javascript. La idea era agregar un detector de eventos de unload a la ventana para registrar si se ha cerrado. Ahora también es posible que la página principal se actualice, en cuyo caso recuperaré la referencia a la ventana a través de window.open usando el mismo nombre de destino. Fue entonces cuando tuve que aprender que los detectores de eventos básicos como load , unload y antes de descargar ya no se beforeunload se recarga la página.
Probé este código con Firefox y Chrome:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <button onclick="openWindow()">Open window</button> <span id="state"></span> </body> <script> document.getElementById("state").innerHTML = "Closed"; function openWindow() { const extWindow = window.open("about:blank", "ExtWindow", 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,width=1600,height=900'); document.getElementById("state").innerHTML = "Opened"; extWindow.addEventListener('load', () => console.log('load')); extWindow.addEventListener('beforeunload', () => console.log('beforeunload')); extWindow.addEventListener('unload', () => { document.getElementById("state").innerHTML = "Closed"; console.log('unload'); }); } </script> </html> Para replicar este comportamiento, abra la ventana a través del botón, luego vuelva a cargar la página con la ventana aún abierta, haga clic en el botón nuevamente para recuperar la referencia, luego cierre la ventana. Ninguno de los eventos se activará si la página se ha recargado. (Desafortunadamente, window.open no parece funcionar dentro de un fragmento).
No estoy exactamente seguro de si este comportamiento es intencional, pero si es así, ¿hay algo que pueda hacer para que funcione?
Sé que podría recurrir a setInterval para verificar la propiedad closed de la ventana, pero me gustaría evitar cualquier sondeo y confiar en los detectores de eventos.