Ver Mensaje Individual
  #5 (permalink)  
Antiguo 24/06/2010, 21:15
Avatar de jaullo
jaullo
 
Fecha de Ingreso: abril-2009
Mensajes: 994
Antigüedad: 15 años, 6 meses
Puntos: 30
Respuesta: Ayuda actualizar bd al cerrar ventana

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 original
  1. function handleWindowClose()
  2. {
  3.   if((window.event.clientX<0) || (window.event.clientY<0))
  4.     {
  5.       event.returnValue = "Si ha echo cambios en los campos sin salvarlos, por favor presiones guardar o sus cambios se perderán.";
  6.     }
  7. }

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 original
  1. if (event.altKey==true && event.keyCode==0 )
  2.  
  3. {  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
  1. <script type="text/javascript">
  2. <!--
  3. function callAjax(webUrl, queryString)
  4. {
  5.  var xmlHttpObject = null;
  6.  
  7.  try
  8.  {
  9.   // Firefox, Opera 8.0+, Safari...
  10.  
  11.   xmlHttpObject = new XMLHttpRequest();
  12.  }
  13.  catch(ex)
  14.  {
  15.   // Internet Explorer...
  16.  
  17.   try
  18.   {
  19.    xmlHttpObject = new ActiveXObject('Msxml2.XMLHTTP');
  20.   }
  21.   catch(ex)
  22.   {
  23.    xmlHttpObject = new ActiveXObject('Microsoft.XMLHTTP');
  24.   }
  25.  }
  26.  
  27.  if ( xmlHttpObject == null )
  28.  {
  29.   window.alert('AJAX no está disponible en este explorador web');
  30.   return;
  31.  }
  32.  
  33.  xmlHttpObject.open("GET", webUrl + queryString, false);
  34.  xmlHttpObject.send();
  35.  
  36.  return xmlText;
  37. }
  38. // -->
  39. </script>
  40.  
  41. <script type="text/javascript">
  42. <!--
  43. var g_isPostBack = false;
  44.  
  45. window.onbeforeunload = function ()
  46. {
  47.  if ( g_isPostBack == true )
  48.   return;
  49.  
  50.  var closeMessage =
  51.   'Esta saliendo de esta página.\n' +
  52.   'Si ha realizado cambios y no ha guardado, sus cambios se perderán.\n' +
  53.   'Está seguro que desea salir?';
  54.  
  55.  if ( window.event )
  56.  {
  57.   // IE only...
  58.  
  59.   window.event.returnValue = closeMessage;
  60.  }
  61.  else
  62.  {
  63.   // Other browsers...
  64.  
  65.   return closeMessage;
  66.  }
  67.  
  68.  g_isPostBack = false;
  69. }
  70. window.onunload = function ()
  71. {
  72.  if ( g_isPostBack == true )
  73.   return;
  74.  
  75.  var webUrl = 'LogoffPage.aspx';
  76.  var queryString = '?LogoffDatabase=Y&UserID=' + '<%= Session["UserID"] %>';
  77.  var returnCode = callAjax(webUrl, queryString);
  78.  //alert(returnCode);
  79. }
  80. // -->
  81. </script>


//////////////////////////////////////////////////////////////////////////
// Page1.aspx.cs
//////////////////////////////////////////////////////////////////////////

Código ASP:
Ver original
  1. Private Sub Page_Load(sender As Object, e As System.EventArgs)
  2.     If Me.IsPostBack Then
  3.         Me.Session("UserID") = "12345"
  4.     End If
  5.  
  6.     Me.RegisterOnSubmitStatement("OnSubmitScript", "g_isPostBack = true;")
  7. End Sub


//////////////////////////////////////////////////////////////////////////
// LogoffPage.aspx.cs
//////////////////////////////////////////////////////////////////////////

Código ASP:
Ver original
  1. Protected Function LogoffUser(userId As String) As String
  2.     Dim returnValue As String = "OK"
  3.  
  4.     ' Llamar a la base de datos, registrar el usuario fuera de aqui
  5.  
  6.     Return returnValue
  7. End Function
  8.  
  9. Private Sub Page_Load(sender As Object, e As System.EventArgs)
  10.     Dim logoffDatabase As String = If((Me.Request("LogoffDatabase") Is Nothing), String.Empty, Me.Request("LogoffDatabase"))
  11.     Dim returnValue As String = String.Empty
  12.  
  13.     If logoffDatabase = "Y" Then
  14.         If returnValue.Length > 0 Then
  15.             returnValue += ", "
  16.         End If
  17.  
  18.         returnValue += Me.LogoffUser(Me.Session("UserID").ToString())
  19.     End If
  20.  
  21.     Me.Response.ClearHeaders()
  22.     Me.Response.Clear()
  23.     Me.Response.Write(returnValue)
  24.     Me.Response.[End]()
  25. End Sub

Espero esto te aclare un poco mas el panorama.

Saludos,