Ok, voy a tratar de dara una explicación un poco mas acertada:
Tienes el evento onUnload de la pagina.
El problema con este evento es que no se puede cancelar la descarga de la página. El evento, se dice él mismo onUnload, lo que significa que la página ya está descargada.
En Internet Explorer, tienes el caso del evento onbeforeunload de la pagina. Esta es una una buena idea para comprobar la descarga de una web. Por supuesto debes comprobar en google este evento para firefox.
Hay algo que debes tener en cuenta! Nunca se puede coger el evento de cierre del navegador al 100%.
Por ejemplo, si el usuario mata el proceso del explorador. Entonces el onUnload, o incluso la onbeforeunload no se llaman.
Sin embargo, aquí hay algunos metodos Javascript para comprobar si el usuario hace clic en la X en la parte superior derecha del navegador:
Código Javascript
:
Ver originalfunction handleWindowClose()
{
if((window.event.clientX<0) || (window.event.clientY<0))
{
event.returnValue = "Si ha echo cambios en los campos sin salvarlos, por favor presiones guardar o sus cambios se perderán.";
}
}
Por ejemplo, puedes ejecutar este script cada vez que se hace clic en un botón del ratón (bueno, tal vez eso es algo de sobrecarga.) Pero, de nuevo, ¿qué pasa si un usuario cierra su navegador con la combinación de teclas ALT + F4?
Esta es la solución para el ALT+F4,
Código Javascript
:
Ver originalif (event.altKey==true && event.keyCode==0 )
{ alert("ALT + F4 ha sido presionado"); }
Pero recuerda, esto no te asegura la captura del evento al 100% (El usuario puede utilizar el TaskManager, o cerrar desde otro boton,etc)
Tambien, este es un ejemplo de como llamar un metodo desde el server-side cuando una ventana es cerrada.
Este ejemplo implica la creación de una página aparte (en este ejemplo, LogoffPage.aspx) que albergara la función (la página no se mostrará), pero las multiples llamadas a la funcion puede ser realizadas allí y se puede acceder a través del Query String. Esto es básicamente lo mismo que crear un servicio Web, lo que sería una mejor solución, pero es más difícil puesto aquí.
//////////////////////////////////////////////////////////////////////////
// Page1.aspx
//////////////////////////////////////////////////////////////////////////
Código Javascript
:
Ver original<script type="text/javascript">
<!--
function callAjax(webUrl, queryString)
{
var xmlHttpObject = null;
try
{
// Firefox, Opera 8.0+, Safari...
xmlHttpObject = new XMLHttpRequest();
}
catch(ex)
{
// Internet Explorer...
try
{
xmlHttpObject = new ActiveXObject('Msxml2.XMLHTTP');
}
catch(ex)
{
xmlHttpObject = new ActiveXObject('Microsoft.XMLHTTP');
}
}
if ( xmlHttpObject == null )
{
window.alert('AJAX no está disponible en este explorador web');
return;
}
xmlHttpObject.open("GET", webUrl + queryString, false);
xmlHttpObject.send();
return xmlText;
}
// -->
</script>
<script type="text/javascript">
<!--
var g_isPostBack = false;
window.onbeforeunload = function ()
{
if ( g_isPostBack == true )
return;
var closeMessage =
'Esta saliendo de esta página.\n' +
'Si ha realizado cambios y no ha guardado, sus cambios se perderán.\n' +
'Está seguro que desea salir?';
if ( window.event )
{
// IE only...
window.event.returnValue = closeMessage;
}
else
{
// Other browsers...
return closeMessage;
}
g_isPostBack = false;
}
window.onunload = function ()
{
if ( g_isPostBack == true )
return;
var webUrl = 'LogoffPage.aspx';
var queryString = '?LogoffDatabase=Y&UserID=' + '<%= Session["UserID"] %>';
var returnCode = callAjax(webUrl, queryString);
//alert(returnCode);
}
// -->
</script>
//////////////////////////////////////////////////////////////////////////
// Page1.aspx.cs
//////////////////////////////////////////////////////////////////////////
Código ASP:
Ver originalPrivate Sub Page_Load(sender As Object, e As System.EventArgs)
If Me.IsPostBack Then
Me.Session("UserID") = "12345"
End If
Me.RegisterOnSubmitStatement("OnSubmitScript", "g_isPostBack = true;")
End Sub
//////////////////////////////////////////////////////////////////////////
// LogoffPage.aspx.cs
//////////////////////////////////////////////////////////////////////////
Código ASP:
Ver originalProtected Function LogoffUser(userId As String) As String
Dim returnValue As String = "OK"
' Llamar a la base de datos, registrar el usuario fuera de aqui
Return returnValue
End Function
Private Sub Page_Load(sender As Object, e As System.EventArgs)
Dim logoffDatabase As String = If((Me.Request("LogoffDatabase") Is Nothing), String.Empty, Me.Request("LogoffDatabase"))
Dim returnValue As String = String.Empty
If logoffDatabase = "Y" Then
If returnValue.Length > 0 Then
returnValue += ", "
End If
returnValue += Me.LogoffUser(Me.Session("UserID").ToString())
End If
Me.Response.ClearHeaders()
Me.Response.Clear()
Me.Response.Write(returnValue)
Me.Response.[End]()
End Sub
Espero esto te aclare un poco mas el panorama.
Saludos,