Foros del Web » Programando para Internet » Javascript »

Detectar cierre del Navegador

Estas en el tema de Detectar cierre del Navegador en el foro de Javascript en Foros del Web. Hola, disculpen tengo un problema con un CMS en PHP que corre unas aplicaciones de Inventarios que diseñe para pedidos de un negocio, el problema ...
  #1 (permalink)  
Antiguo 01/06/2012, 12:35
Avatar de jlcm_2000  
Fecha de Ingreso: diciembre-2006
Mensajes: 21
Antigüedad: 18 años
Puntos: 1
Pregunta Detectar cierre del Navegador

Hola, disculpen tengo un problema con un CMS en PHP que corre unas aplicaciones de Inventarios que diseñe para pedidos de un negocio, el problema es que el gestor de pedidos puede dejar abierto pedidos sin procesar los cuales afecta ciertos valores de disponibilidad en la base de datos del negocio.

Si el usuario procesa o cancela un pedido y cierra sesion o el navegador no hay problema pero si queda un pedido abierto es necesario que devuelva los valores de disponibilidad, esto lo hace un Script en PHP que ya tengo pero Obviamente el PHP nunca se entera si el cliente cerro el navegador o se salio del sitio, por eso recurro a JavaScript con apoyo de Ajax ejecuten mi script en php.

Las funciones en JavaScript, Ajax y PHP ya las tengo y funcionan perfecto solo necesito el evento disparador, trate usando onbeforeunload y hace exactamente lo que quiero, si el usuario cierra el navegador o la pestaña del sitio ejecuta mis scripts, el problema es que este evento se ejecuta siempre mientras el usuario navega en el sitio ejecutando siempre los scripts. Yo corro mis funciones de la siguiente manera:

Código:
<head>
<script type="text/javascript">
//< ![CDATA[

 function closeIt() {
  /* EJECUTA SCRIPT PHP USANDO AJAX */ 
 }

window.onbeforeunload = closeIt;
 //]]>
</script>
</head>
Agradeceria mucho si alguien tiene una idea de como correr mi funcion solo al cerrar el navegador o la pestaña del sitio, cualquier idea orientacion sobre esto y gracias de antemano.
  #2 (permalink)  
Antiguo 01/06/2012, 13:22
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: Detectar cierre del Navegador

es un tema que se ha discutido varias veces.

no se puede usar onbeforeunload para detectar eso, cuando se retorna algo por éste evento el navegador despliega una ventana de confirmación para notificar al usuario si quiere salir, si lo acepta se ejecuta onunload, pero una vez en él se destruye todo el DOM incluso los XmlHttpRequest, por lo cual las peticiones Ajax nunca llegan al server
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 01/06/2012, 13:36
Avatar de jlcm_2000  
Fecha de Ingreso: diciembre-2006
Mensajes: 21
Antigüedad: 18 años
Puntos: 1
Respuesta: Detectar cierre del Navegador

Muchas Gracias por responder, justo terminaba de leer tu respuesta en un tema de Abril del año pasado, de hecho el script ajax lo ejecuto antes del return y no me importa si el usuario le da cancelar ya que solo le notifica que los pedidos que quedaron abiertos han sido removidos por intentar cerrar el navegador, el problema es que no lo hace solo al cerrar el navegador sino que tambien al navegar en el sitio de la aplicacion web.

Ahora tu que sabes mucho de esto, entonces no existe de ninguna manera posible poder ejecutar un script ajax antes de cerrar el navegador??
  #4 (permalink)  
Antiguo 01/06/2012, 14:43
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: Detectar cierre del Navegador

si lo supiera

pero nada, es realmente complicado teniendo en cuenta el GC de cada navegador, lo único en que puedes medio confiar es en que expire la sesión (cookie)
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 01/06/2012, 16:20
Avatar de jlcm_2000  
Fecha de Ingreso: diciembre-2006
Mensajes: 21
Antigüedad: 18 años
Puntos: 1
Respuesta: Detectar cierre del Navegador

Ok, me tendre que conformar con un cron que limpie el sistema, gracias por la respuesta.
  #6 (permalink)  
Antiguo 14/08/2012, 01:50
 
Fecha de Ingreso: junio-2012
Ubicación: Cerca del mar
Mensajes: 19
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Detectar cierre del Navegador

Bien chicos.
Después de un año leyendo foros, aprendiendo varios lenguajes etc, al final he conseguido resolver el mismo problema que se plantea aquí (quizás no tan elegantemente como a la gente le gustaría pero en fin..).
Tenía el mismo problema, sobretodo con registros de la base de datos con los que no podía permitirme el lujo de mantener en una tabla de bloqueos, así que al final hice esto:
Es cierto que en el beforeUnload no se pueden enviar peticiones al servidor (como si permite la tecnología AJAX en cualquier otro momento), pero javascript si permite hacer el redireccionamiento a otra pagina. Al redireccionar a otra pagina, he añadido a la url la información necesaria para mi caso en concreto (códigos de registros y tablas). La pagina a la que se redirecciona después del evento es una página que esta preparada para obtener la url y tratar esa información. De esta manera, aunque no se envíen las peticiones al servidor, mediante esta pagina residual se puede hacer el tratamiento de la información que se desee (en mi caso el desbloqueo de un registro).
Si os digo la verdad, esto me ha llevado varios quebraderos de cabeza, pero creo que ya no lo hará más.
Una última cosa, aun estoy implementando esto en varios navegadores, así que no puedo garantizar que en todos sea así. Si alguien pone esto en prueba y detecta algún error, por favor que me lo reporte y, a banda de llevarme tremendo chasco xD, seguiré buscando una solución al tema.
Gracias por el tiempo ;)
Laia.

Etiquetas: ajax, cierre, funcion, navegador, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:10.