Foros del Web » Programando para Internet » Javascript »

onBeforeUnload: duración visitas usuarios

Estas en el tema de onBeforeUnload: duración visitas usuarios en el foro de Javascript en Foros del Web. Alguien conoce algún sistema para cronometrar la duración exacta de las visitas de la gente que se conecta a un sitio ??? La lógica me ...
  #1 (permalink)  
Antiguo 02/10/2005, 05:37
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años
Puntos: 0
onBeforeUnload: duración visitas usuarios

Alguien conoce algún sistema para cronometrar la duración exacta de las visitas de la gente que se conecta a un sitio ???
La lógica me pide utilizar el evento "onBeforeUnload" en todas las páginas de mi sitio y llamar a un script de servidor para almacenar la hora cada vez que se activa dicho evento. Teniendo en cuenta que hemos almacenado también la hora en la que el usuario accedió a la web por primera vez (inicio de sesión), podemos restar ambas fechas y obtener el tiempo exacto de la visita. He probado varias cosas y lo más cerca que me quedo es ésto:

----- en todas las páginas del sitio : ---------------
Código PHP:
<? session_start();
.....
/*
código de conexión a la bbdd. A continuación dejamos preparada la SQL en el lado servidor para ser ejecutada desde el cliente:
*/

$SentenciaSql="UPDATE Visitantes SET Date_End ='".time()."' WHERE IdVisitante ='".$_SESSION['idvisitante']."'";
?>
<html>
<head></head>
<body onBeforeUnload="eval("<? echo $result=@mysql_query($SentenciaSql);?>");">
.....
</body>
</html>
--------------------------------------------------
Se graba bien la fecha en la bbdd cuando se pasa de una página a otra del sitio, pero cuando el usuario cierra el navegador o se mueve hacia otra dirección web ajena a nuestro sitio, el evento no se activa y no se produce la grabación.

Si ponemos:
<body onBeforeUnload="alert("adios");">
El evento responde bien a todos los cierres de navegador. El problema parece ser la llamada desde Javascript a scripts de servidor.
Alguien podría abrir luz en este tema ?, Gracias de antemano y saludos a todos.

Última edición por txus35; 02/10/2005 a las 13:23
  #2 (permalink)  
Antiguo 02/10/2005, 07:05
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
hola jam1138 y txus35!
Si no me equivoco, el evento onBeforeUnload solo funciona en IE. Ten eso en cuenta.
Ahora, explica que quieres hacer con esta linea, porque me parece que es algo fuera de este mundo
<body onBeforeUnload="eval("<? echo $result=@mysql_query($SentenciaSql);?>");">
Según entendi, tu necesitas:
  1. que al cargarse una pagina, se registre la hora de ingreso del usuario.
  2. que al cerrarse la pagina, se registre la hora.
Lo primero ya lo tienes.
Para el segundo punto tienes que aclarar algo: Si la pagina que ha abierto el usuario, es una ventana-hija, entonces simplemente puedes regresar un valor a la ventana-padre (opener).
Si todo sucede en una solo pagina, tendrias que enviar la sentencia al servidor que registre la salida.
Bueno, se me ocurre eso. Quizas alguien tenga una mejor idea.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 02/10/2005, 07:33
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años
Puntos: 0
Gracias Flavio y jam1138, por contestar:

1- Cierto: "onBeforeUnload" no funciona bajo Netscape (no he probado Ff), pero me da igual. Centrémonos en IE en el que sí parece funcionar.

2- La línea : <body onBeforeUnload="eval("<? echo $result=@mysql_query($SentenciaSql);?>");">

Se trata de la inserción en la bbdd de la hora actual hecha desde javascript. Cuando se activa el evento "onBeforeUnload", el flujo de ejecución del código web se para en la parte cliente. Debido a ésto, debo hacer la inserción de la hora desde javascript, porque si hago lo siguiente:

<body onBeforeUnload="window.location='do_guarda_hora.ph p' ">

y en "do_guarda_hora.php" realizo el guardado de la hora en la bbdd, la operación no se lleva a cabo (lo he probado).

Y es curioso: si escribo un "alert" después de procesar los datos:

<body onBeforeUnload="window.location='do_guarda_hora.ph p'; alert('adios');">
Todo funciona correctamente pero hay que soportar la aparición del "alert", cosa que espanta a los visitantes.

3-No hay ventanas hijas ni padres (openers). Se trata de una galería de fotos. Los visitantes van navegando por galerías de fotos y fichas de fotos. Se trata de conocer con exactitud el tiempo que pasan en la web.

Como bien dices, lo que tengo que hacer es "...enviar la sentencia al servidor que registre la hora de salida", pero no sé cómo !!??.

Hago notar que lo logro sólo en parte cuando el visitante cambia de página en nuestra web. Pero no lo logro cuando el usuario cierra manualmente el navegador o cambia de página hacia otra que no es de nuestro sitio.

¿Se os ocurre alguna idea?, a ver si sacamos entre todos este tema tan interesante de cuantificar el tiempo de las visitas que nos hacen. Saludos a todos y gracias por colaborar.

Última edición por txus35; 02/10/2005 a las 08:06
  #4 (permalink)  
Antiguo 02/10/2005, 08:25
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Saludos ...

Temo que no hay manera de detectar cuando un usuario cierra una ventana y que tendrás que cambiar de método. 2 opciones (sin meterse en mayores problemas):

1) Puedes crear un iframe oculto que se recargue constantemente y mediante él estar monitoreando a tu usurio.

2) Con el evento que tienes ahora lanzar por debajo un pop-up que hará el monitoreo y se cerrará automáticamente...hay que tener en cuenta el bloqueo de pop-ups.

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #5 (permalink)  
Antiguo 02/10/2005, 10:42
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años
Puntos: 0
Cita:
Iniciado por jam1138
Saludos ...
2) Con el evento que tienes ahora lanzar por debajo un pop-up que hará el monitoreo y se cerrará automáticamente...hay que tener en cuenta el bloqueo de pop-ups.
La forma nº 2) funciona perfectamente pero se traduce en una ralentización de la navegación entre páginas. Cada vez que se ejecuta el evento "onBeforeUnload", se abre la ventana hija encargada de almacenar la fecha en la bbdd. He intentado minimizar esta ventana todo lo que he podido para hacerla lo más ligera y discreta posible:

<body onBeforeUnload="window.open('do_Date_End.php','win fin','z-lock=yes, alwaysLowered=yes, width=0,height=0, top=0, left=0, scrollbars=no, status=no, titlebar=no, toolbar=no');")>
........
........
</body>


Aún y todo, se nota su aparición. Si alguien sabe cómo hacerla aún más ligera se agradecería.

También sería interesante para agilizar la navegación entre páginas, detectar de alguna manera cuándo el usuario sale de la web (ya sea por cierre de navegador o por salida hacia otra web). El evento "onBeforeUnload" detecta además la transición entre las páginas de nuestra web dificultando la navegación. Si alguien tiene alguna idea....

Un saludo, gracias y paso a investigar la opción 1) el tema IFRAME.

Última edición por txus35; 02/10/2005 a las 11:08
  #6 (permalink)  
Antiguo 02/10/2005, 12:16
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Consultando con mi camaradas rusos, uno de ellos dio el sgte codigo:
Código PHP:
$time1=time();    
$time2=time();    
if (!
$user[$REMOTE_ADDR]) {//si no hay ese IP, lo insertamos
$pol=mysql_query("INSERT  into table values('','$user','$time1','')");    
setcookie("users"$user);    
$auth="OK";    
}    
$out mysql_query("SELECT id,user,time FROM table WHERE user='".$_COOKIE['users']."'");    
if (
mysql_num_rows($out) == 1) {    
        
$auth="OK";    
echo 
"el usuario esta!";    
}    
if(
$auth=""){    
echo 
"se fue!";    
//registramos la hora de salida
$pol=mysql_query("INSERT  into table values('','$user','$time1','$time2') WHERE user='".$_COOKIE['users']. "' ");    

Este script usa cookies!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #7 (permalink)  
Antiguo 02/10/2005, 12:36
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años
Puntos: 0
Muy interesante punto de vista Flaviovich, tus camaradas rusos son unos hachas xD)!!!. Yo aporto otra alternativa por si los visitantes no tienen habilitadas las cookies. Se trata del punto 2) que mencionaba nuestro colega jam1138 en este mismo tema, unos comentarios arriba: "lanzar por debajo un pop-up que hará el monitoreo y se cerrará automáticamente". Quizás sea algo rudimentaria pero es lo mejor que tenía hasta ahora. Funciona en IE, Netscape y Ff pero tiene importantes puntos negativos:

1- ralentiza algo la navegación pero sin exagerar.
2- el evento "onBeforeUnload" no se ejecuta cuando el usuario cierra el navegador o se va a otra web. Es decir actúa como un "onUnload" entre las páginas del sitio, por lo que la medición del tiempo de visita sigue sin ser exacta.
3- posible bloqueo de popups por parte del visitante.

En cada página de nuestro sitio colocamos esta etiqueta body:
Código HTML:
<body onBeforeUnload="window.reload();if(window.event) window.open('DoDate_End.php','winfin','z-lock=yes, alwaysLowered=yes, width=0,height=0, top=0, left=0, scrollbars=no, status=no, titlebar=no, toolbar=no');window.focus();"> 
Con "window.focus();" mantenemos el protagonismo en la ventana ppal.

Clásico fichero de actualización de la hora, 'DoDate_End.php':
Código PHP:
session_start();
echo 
"<script>self.blur();</script>"//quita protagonismo a la ventana abierta 
$SentenciaSql="UPDATE Visitantes SET Date_End ='".time()."' WHERE IdVisitante ='".$_SESSION['idvisitante']."'";
$result=@mysql_query($SentenciaSql); //insertamos fecha actual en bbdd cada vez q hay evento onBeforeOnload
unset($result);
echo 
"<script>window.close();</script>"//cierra ventana abierta 

Última edición por txus35; 02/10/2005 a las 14:08
  #8 (permalink)  
Antiguo 02/10/2005, 14:21
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años
Puntos: 0
Cita:
Iniciado por flaviovich
Consultando con mi camaradas rusos, uno de ellos dio el sgte codigo: ..... Este script usa cookies!
Este código está muy bien pero sigo sin entender cómo aplicarlo. La clave es saber el momento en el que el visitante se marcha para aplicar el código ruso.
¿Quizás con un timer, ir ejecutando el código ruso cada X segundos para comprobar la presencia del visitante ???
No sé, no me queda claro la forma de aplicarlo.
  #9 (permalink)  
Antiguo 02/10/2005, 15:25
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Claro!
Eso se puede hacer con la funcion setTimeout("codigo", tiempo en miliseg);
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #10 (permalink)  
Antiguo 03/10/2005, 10:49
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años
Puntos: 0
Busqueda

Cita:
Iniciado por flaviovich
Claro!...Eso se puede hacer con la funcion setTimeout("codigo", tiempo en miliseg);
Como bien dice flaviovich, la idea es grabar automáticamente la fecha actual en la bbdd cada X segundos mientras el visitante navega por la web. Estoy intentado ejecutar el código ruso (script de servidor) mediante la función setTimeout de javascript (lado cliente). Sólo consigo que se grabe la fecha una sola vez. Creo que hay que realizar la grabación de fecha mediante alguna función del lado del server. Algo parecido al setTimeout de javascript pero en PHP. Voy a ver si busco algo, cualquier idea será bien recibida. Saludos a todos.
  #11 (permalink)  
Antiguo 03/10/2005, 12:35
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Cita:
Iniciado por txus35
Alguien conoce algún sistema para cronometrar la duración exacta de las visitas de la gente que se conecta a un sitio ???
Estuve buscando y encontre lo sgte:
  1. Advantage Web Log Analyzer
  2. AWStats
El primero lo instale, pero no encontre algo parecido a lo que necesitas. Ademas que es un software legal, y solo funciona por 14 dias.
El segundo no tuve tiempo de probarlo. Quizas tu te animes

Suficiente llamar a la funcion setTimeout cada minuto. Solo habria que idear una forma de que no se refleje este llamado, porque sino puede ser incomodo para el usuario.

Por ultimo, quizas exista alguna forma de hacer esto configurando algo en el servidor.

Bueno, son simplemente ideas. Ojala te ayuden en algo
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #12 (permalink)  
Antiguo 18/07/2008, 09:51
Avatar de Un_Tico  
Fecha de Ingreso: julio-2008
Ubicación: Cartago, Costa Rica
Mensajes: 176
Antigüedad: 15 años, 9 meses
Puntos: 4
Respuesta: onBeforeUnload: duración visitas usuarios

Hola txus35 me parece que algunas ideas que te han dado son buenas pero nada eficientes, si quieres hacer algo realmente eficiente investiga sobre ajax y algun framework de javascript como prototype, mootools, jquery, etc estos frameworks son una gran herramienta en el desarrollo web y un plus para tu sitio web, una vez que hayas dominado alguna de estas herramientas tus sitios web ya no seran los mismos

http://docs.jquery.com/
http://www.prototypejs.org/
http://mootools.net/

Suerte...
  #13 (permalink)  
Antiguo 18/07/2008, 09:57
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: onBeforeUnload: duración visitas usuarios

Bienvenido, Un_Tico.

Por favor, no revivas temas viejos.
Véase: http://www.forosdelweb.com/f40/polit...el-web-101485/

Gracias.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 19:31.