2012-04-22 5 views
11

Estoy trabajando en un chat y estoy tratando de averiguar cómo puedo detectar que el usuario ha dejado la página o no. Casi todo está siendo manejado por la base de datos para evitar que la interfaz se estropee.AJAX y el usuario que sale de una página

Entonces, lo que intento hacer es que una vez que la página se abandona por algún motivo (ventana cerrada, ir a otra página, hacer clic en un enlace, etc.) se dispare una llamada ajax antes de que una persona se vaya para poder actualizar la base de datos

Esto es lo que he intentado:

$(window).unload(function(){ 
     $.post("script.php",{key_leave:"289583002"}); 
}); 

Por alguna extraña razón, no funcionaría, y he comprobado el código php, y funciona bien. ¿Alguna sugerencia?

+0

duplicado posible de [JavaScript, navegadores, cerrar la ventana - envían una petición AJAX o ejecutar una secuencia de comandos de cierre de la ventana] (http://stackoverflow.com/questions/6162188/javascript-browsers-window -close-send-an-ajax-request-or-run-a-script-on-win) –

Respuesta

31

Prueba esto:

$(window).unload(function(){ 
    $.ajax({ 
     type: 'POST', 
     url: 'script.php', 
     async:false, 
     data: {key_leave:"289583002"} 
    }); 
}); 

Nota del async:false, de esa manera que el navegador espera para la solicitud hasta el final.

El uso de $.post es asincrónico, por lo que la solicitud puede no ser lo suficientemente rápida antes de que el navegador deje de ejecutar el script.

+0

¡Genial, pruébalo! – Majo0od

+0

¡Dios mío, funcionó! Muchas gracias, aprendí algo nuevo hoy :-) – Majo0od

+0

De nada :) – stewe

1

Intenta agregar una ventana emergente (pregunta ("¿saliendo tan temprano?")) Después de $ .post. Puede funcionar Aunque puede ser una mala experiencia para el usuario. :)

+0

No funcionó .... – Majo0od

+0

Dudo que funcione con cualquier variación, muchos navegadores tienen políticas diferentes cuando el navegador es cierre o solo la pestaña se está cerrando o incluso la URL de la página se redirige a otra url. ¡El problema más grande aquí es que cuando la página se "cierra" se eliminan todas las conexiones y otras cosas! Entonces, incluso si envía la solicitud POST unos pocos milisegundos antes de que se elimine la página, existe una gran posibilidad de que la conexión finalice ... Es por eso que le sugerí que utilice la función prompt después de la llamada a la función $ .post. Trataré de crear una muestra, pero no puedo prometer nada. –

3

Esta no es la forma correcta de hacerlo ... Supongamos que el sistema operativo simplemente se cuelga o algo sucede en el proceso de navegadores, entonces este evento no se disparará. Y nunca sabrá cuándo se fue el usuario, mostrándole en línea nunca después de que se haya desconectado. En lugar de esto, lo que puedes hacer es.

  1. Intente conectarse con una toma de corriente para que pueda saber que el usuario se desconecta cuando el conector está desconectado
  2. puede enviar una solicitud al servidor (por ejemplo después de cada 1 s) para que pueda saber que el el usuario todavía está conectado. Si no recibió la solicitud, incluso después de 2 segundos, desconecte al usuario.
+0

No sé cómo hacer eso, ¿tiene un ejemplo? – Majo0od

+0

¿qué está usando el lado del servidor? asp.net? –

+1

Él está usando PHP. Aquí hay una buena fuente que puede ayudarlo a comenzar https://github.com/nicokaiser/php-websocket También tiene un objeto SWF para implementación de socket para navegadores que no admiten sockects web. –

0

Esto se refiere a la respuesta anterior. https://stackoverflow.com/a/10272651/1306144

Esto ejecutará la llamada ajax cada 1 seg. (1000)

function callEveryOneSec() { 
    $jx.ajax({}); // your ajax call 
} 

setInterval(callEveryOneSec, 1000); 
+1

Creo que enviar AJAX cada segundo puede matar al servidor cuando muchos usuarios ... – Siper

Cuestiones relacionadas