valor secuencialmente retornar pagina funcion example ejemplos ejecutar despues cargar carga asincrona antes javascript jquery ajax

retornar - ejecutar javascript secuencialmente



$(ventana).unload espera a que la llamada AJAX termine antes de salir de una página web (8)

Básicamente, una vez que un usuario deja una página web en mi aplicación, necesito llamar a un script PHP con AJAX, que insertará un tiempo pasado en la página web y luego abandonará la página.

Es importante esperar a que finalice la solicitud de AJAX porque las páginas web de mi aplicación no son accesibles para los usuarios a menos que hayan pasado cierto tiempo en una página anterior (digamos dos minutos).

Aquí está mi código jquery:

$(document).ready(function() { var teid = TEID; var startTime = new Date().getTime(); $(window).unload(function() { var timeSpentMilliseconds = new Date().getTime() - startTime; var t = timeSpentMilliseconds / 1000 / 60; $.ajax({ type: ''POST'', url: ''/clientarea/utils/record-time'', data: ''teid='' + teid + ''&t='' + t }); }); });

¿Cómo debo cambiarlo para que espere a que termine la solicitud de AJAX antes de abandonar la página web?

EDITAR:

O podría ser mejor (más fácil) simplemente dejar que la solicitud AJAX se repita cada minuto más o menos. ¿Es eso posible?


¿Qué hay de establecer una cookie en el controlador de descarga? El servidor debería verlo en las solicitudes posteriores.

<script> $(window).unload(function(){document.cookie=''left_on=''+(new Date())}) </script>


Bueno, puede establecer async: false en su llamada AJAX para que el navegador espere a que la solicitud termine antes de hacer cualquier otra cosa, pero tenga en cuenta que esto "bloqueará" el navegador mientras dure la solicitud.

$.ajax({ type: ''POST'', async: false, url: ''/clientarea/utils/record-time'', data: ''teid='' + teid + ''&t='' + t });

Del manual:

Por defecto, todas las solicitudes se envían de forma asíncrona (es decir, se establece en verdadero de manera predeterminada). Si necesita solicitudes sincrónicas, establezca esta opción en falso. Solicitudes entre dominios y tipo de datos: las solicitudes "jsonp" no son compatibles con la operación síncrona. Tenga en cuenta que las solicitudes sincrónicas pueden bloquear temporalmente el navegador, deshabilitando cualquier acción mientras la solicitud está activa.


Creo que sería mucho mejor utilizar una técnica de sondeo como usted sugiere, aunque causará cierta carga en el servidor web.

$(document).ready(function() { var teid = TEID; var startTime = new Date().getTime(); var ajaxFunc = function() { var timeSpentMilliseconds = new Date().getTime() - startTime; var t = timeSpentMilliseconds / 1000 / 60; $.ajax({ type: ''POST'', url: ''/clientarea/utils/record-time'', data: ''teid='' + teid + ''&t='' + t }); }; setInterval(ajaxFunc, 60000); })

Te alegrarás cuando puedas usar websockets :)


El método jQuery.ajax() tiene la opción async . Si lo configura en false la llamada se bloqueará hasta que vuelva la respuesta (o se agotó el tiempo de espera). Estoy bastante seguro de que, al llamar esto, el navegador se usará en el controlador de descarga.

Nota al margen: no puede confiar en que esto funcione. Si el navegador le da al usuario la opción de cancelar los controladores de descarga (lo que algunos navegadores hacen después de un tiempo de espera), el "tiempo invertido en el sitio" nunca se actualizará. Podría agregar un temporizador al sitio, que periódicamente llama un script en el servidor y actualiza la hora. No tendrá un valor exacto, pero en su caso, esto no es necesario.

Si solo necesita saber si el usuario estuvo X segundos en la página, simplemente podría establecer un tiempo de espera en el controlador de setTimeout(function, ms) usando setTimeout(function, ms) ) que realiza una llamada si el usuario ha gastado el tiempo necesario. Entonces no habría necesidad de un controlador de descarga.


La mejor solución es usar navigator.sendBeacon . Es una funcionalidad completamente nueva que se está empezando a implementar en las nuevas versiones de navegadores. La función está disponible en navegadores más nuevos que Chrome 39 y Firefox 31. No es compatible con Internet Explorer y Safari en el momento de la escritura. Para asegurarse de que su solicitud se envíe en los navegadores que aún no admiten la nueva funcionalidad, puede usar esta solución:

var navigator.sendBeacon = navigator.sendBeacon || function (url, data) { var client = new XMLHttpRequest(); client.open("POST", url, false); // third parameter indicates sync xhr client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); client.send(data); };

¡Espero que esto ayude!


No es una buena idea intentar secuestrar el navegador de los usuarios, ya que les causará una mala impresión y los enviará.

Si por algún motivo desea no producir una nueva página hasta que el usuario haya dedicado un tiempo mínimo a la anterior, lo mejor que puede hacer es controlar el servidor, es decir, redirigir a la página actual hasta que haya transcurrido el tiempo solicitado.

Ni siquiera necesita hacer llamadas ajax, solo almacene en la sesión la marca de tiempo de cuando se sirvió la página, y no muestre la siguiente página hasta que haya transcurrido un cierto tiempo.

Asegúrese de decirle a los usuarios que tienen que esperar a que esté lista una nueva página, tal vez con una simple cuenta atrás de javascript.

Si desea que el usuario realmente tenga la página activa durante un cierto período de tiempo (es decir, no para cambiar a otra pestaña / ventana esperando que transcurran los dos minutos), bueno, no puedo proponer una solución efectiva.


para mí, la suya no es una buena idea para que el navegador espere antes de cerrar ...
simplemente porque, ¿qué pasa si realmente quiero cerrarlo? ...

si una página molesta a un usuario, no es bueno ...

mi sugerencia es que, en la página, espere 2 minutos (si son 2 minutos los requisitos), envíe un ajax diciendo que el usuario ha realizado sus 2 minutos ...

luego puede verificarlo en el lado del servidor si uno tiene sus 2 minutos o no ...


usar antes de la onbeforeunload :

$(document).ready(function(){ window.onbeforeunload = function(){ // $.ajax stuff here return false; } });

Esto al menos traerá al usuario un messagebox que le pregunta si quiere cerrar la ventana / pestaña actual.