Tenemos una aplicación que se acerca a los 20 años y que se basa en ventanas emergentes para editar registros de usuario, cada una de las cuales tiene un objeto de estado de sesión y se basa en el código completo de devolución de datos ASP.NET C#. El problema que estamos teniendo (similar a ¿Quiero detectar cuándo el usuario cierra la ventana del navegador? Pero quiero evitar necro-ear una publicación de hace 13 años) es que en los navegadores que no son IE, la solución que teníamos para detectar al hacer clic en la cruz frente a un devolución de datos ya no funciona. Esto se basó en onbeforeunload y el uso de event.clientY para verificar la posición del mouse (un truco feo pero lo único que funcionó) que no existe, por ejemplo, en Chrome.
El problema es que no parece posible distinguir entre hacer clic en la cruz y hacer una devolución de datos, ya que ambos se tratan como si estuvieran descargando el formulario. ¿Hay alguna manera de hacer esto en los navegadores modernos? Hemos intentado lo siguiente (haciendo una llamada asíncrona al servidor para marcar que el objeto de la sesión debe eliminarse):
onbeforeunload - aparece el mensaje '¿cambiando de sitio?' cuadro en cualquier acción de devolución de datos (así como la cruz).
onunload: se activa en cualquier devolución de datos, así como en la cruz.
onvisibilitychange comprobando lo mismo que onunload. p.ej:
document.onvisibilitychange = handleWindowClose; function handleWindowClose(e) { var v = document.visibilityState; if (v === "hidden") { CallServer("Cancel"); // ajax call to server to close session } }Verificando IsPostBack / IsCallBack y usando un indicador en el estado de la sesión para rastrear la diferencia. Al hacer clic en un control de devolución de datos, el servidor llegará dos veces, una para el evento de control y luego la llamada ajax, lo que causa aún más problemas, ya que el código que depende del estado de la sesión se romperá cuando se elimine; tenemos más de 200 páginas con las que lidiar, así que esto no es una opción para nosotros.
Existe la opción de un latido mencionado en la publicación de 2009 para comprobar si hay identificadores de ventanas muertas desde la ventana principal, pero esto no funcionará si esa ventana está cerrada, por ejemplo (tenemos ventanas que abren otras ventanas, etc.)