¿Es posible detectar el tiempo " inactivo " en JavaScript?
Mi caso de uso principal probablemente sería precargar o precargar contenido.
Tiempo de inactividad : período de inactividad del usuario o sin uso de CPU
javascript
Cherian
fuente
fuente
Respuestas:
Aquí hay un script simple que usa JQuery que maneja los eventos de mousemove y keypress. Si el tiempo expira, la página se vuelve a cargar.
fuente
setInterval
, que luego se evalúa como JavaScript.idleTime++;
lugar deidleTime = idleTime + 1;
'mousemove keydown click'
usar banderas de bits (Event.MOUSEMOVE | Event.KEYDOWN | Event.CLICK
), ya que son muuuucho más rápidas que las operaciones de cadenas. ¿Pero realmente quieres hacer esto?Sin usar jQuery, solo JavaScript vainilla:
E inicie la función donde la necesite (por ejemplo: onPageLoad).
Puede agregar más eventos DOM si es necesario. Los más utilizados son:
O registre los eventos deseados utilizando una matriz
Lista de eventos DOM : http://www.w3schools.com/jsref/dom_obj_event.asp
Recuerde usar
window
, odocument
según sus necesidades. Aquí puede ver las diferencias entre ellos: ¿Cuál es la diferencia entre ventana, pantalla y documento en Javascript?El código actualizado con @ frank-conijn y @daxchen mejoran:
window.onscroll
no se activará si el desplazamiento está dentro de un elemento desplazable, porque los eventos de desplazamiento no burbujean.window.addEventListener('scroll', resetTimer, true)
, el tercer argumento le dice al oyente que capture el evento durante la fase de captura en lugar de la fase de burbuja.fuente
document.onload = function () { inactivityTime(); }; document.onmousedown = function () { inactivityTime(); }; document.onkeypress = function () { inactivityTime(); }; document.ontouchstart = function () { inactivityTime(); };
Mejorando la respuesta de Equiman:
.
Además de las mejoras con respecto a la detección de actividad y el cambio de
document
awindow
, este script realmente llama a la función, en lugar de dejarla inactiva.No detecta el uso de CPU cero directamente, pero eso es imposible, porque ejecutar una función provoca el uso de CPU. Y la inactividad del usuario finalmente conduce a un uso cero de la CPU, por lo que indirectamente captura un uso cero de la CPU.
fuente
window.onscroll
no se disparará si el desplazamiento está dentro de un elemento desplazable, porque los eventos de desplazamiento no burbujean. Usandowindow.addEventListener('scroll', resetTimer, true)
, el tercer argumento le dice al oyente que capture el evento durante lacapture
fase en lugar de labubble
fase (IE> 8), vea esta respuestadocument.onscroll
tiene el mismo problema, no disparar si el desplazamiento está dentro de un elemento desplazable?addEventListener
lugar deonscroll
.Creé una pequeña biblioteca que hace esto hace un año:
https://github.com/shawnmclean/Idle.js
Descripción:
Los usuarios de Visual Studio pueden obtenerlo de NuGet de la siguiente manera:
PM> Install-Package Idle.js
fuente
Aquí hay una implementación aproximada de jQuery de la idea de tvanfosson:
fuente
setInterval
una cuerda! ¡Solo asigne una función como variable!setInterval()
evaluar la expresión en el ámbito global y, por lo tanto, no encontrará latimerIncrement()
función que está dentro de la función de controlador .ready. Esta es otra razón para NUNCA pasar cadenas asetInterval()
. Simplemente pase una referencia de función real y no tendrá este problema porque se evalúan en el ámbito actual.Similar a la solución de Iconic anterior (con evento personalizado jQuery) ...
fuente
Puedes hacerlo más elegantemente con guión bajo y jquery -
fuente
Mi respuesta se inspiró en la respuesta de vijay , pero es una solución más corta y más general que pensé que compartiría con cualquiera que pudiera ayudar.
Tal como está actualmente, este código se ejecutará inmediatamente y volverá a cargar su página actual después de 3 minutos sin mover el mouse o presionar las teclas.
Esto utiliza JavaScript simple y una expresión de función invocada de inmediato para manejar los tiempos de espera inactivos de una manera limpia y autónoma.
fuente
onclick
asignación ya que probablemente no sea necesaria además deonmousemove
, pero obviamente cualquiera de estos eventos que se activan mediante programación continuará restableciéndoseidleCounter
. No estoy seguro de por qué simularía la interacción del usuario en lugar de simplemente llamar a una función, pero si eso es algo que necesita hacer por alguna razón, esta respuesta obviamente no funcionará para usted, ni la mayoría de las otras respuestas I ' He examinado esta pregunta.Sé que es una pregunta relativamente antigua, pero tuve el mismo problema y encontré una solución bastante buena.
Solía: jquery.idle y solo tenía que hacer:
Ver demostración de JsFiddle .
(Solo para información: vea esto para el seguimiento de eventos de back-end Leads browserloadload )
fuente
keepTracking
opción enfalse
. Si desea restablecer, puede intentar reiniciarlo. Aquí hay un ejemplo modificado que se dispararía solo una vez: jsfiddle.net/f238hchm/12Todas las respuestas anteriores tienen un controlador de mousemove siempre activo. Si el controlador es jQuery, el procesamiento adicional que realiza jQuery puede sumar. Especialmente si el usuario está usando un mouse para juegos, pueden ocurrir hasta 500 eventos por segundo.
Esta solución evita el manejo de cada evento de mousemove. Esto da como resultado un pequeño error de tiempo, pero que puede ajustar a su necesidad.
http://jsfiddle.net/jndxq51o/
fuente
$(startTimer)
es equivalente a$(document).ready(startTimer)
, asegura que el DOM esté listo antes de enganchar el mousemove y presionar los eventos.Probablemente podría hackear algo al detectar el movimiento del mouse en el cuerpo del formulario y actualizar una variable global con el último tiempo de movimiento. Luego, necesitará tener un temporizador de intervalos en ejecución que verifique periódicamente el último tiempo de movimiento y haga algo si ha pasado suficiente tiempo desde que se detectó el último movimiento del mouse.
fuente
Escribí una pequeña clase ES6 para detectar actividad y, de lo contrario, disparar eventos en tiempo de inactividad. Cubre el teclado, el mouse y el tacto , se puede activar y desactivar y tiene una API muy delgada:
No , no depende de jQuery, aunque puede que tenga que ejecutar a través de Babel para soportar los navegadores antiguos.
https://gist.github.com/4547ef5718fd2d31e5cdcafef0208096
Podría lanzarlo como un paquete npm una vez que reciba algunos comentarios.
fuente
Si está apuntando a un navegador compatible (Chrome o Firefox a partir de diciembre de 2018), puede experimentar con requestIdleCallback e incluir el calzo requestIdleCallback para navegadores no compatibles.
fuente
Prueba este código, funciona perfectamente.
fuente
¡Creo que este código jquery es perfecto, aunque copiado y modificado de las respuestas anteriores! ¡no olvide incluir la biblioteca jquery en su archivo!
fuente
El problema con todas estas soluciones, aunque es correcto, no es práctico, cuando se tiene en cuenta el conjunto valioso de tiempo de espera de la sesión, utilizando PHP, .NET o en el archivo Application.cfc para desarrolladores de Coldfusion. El tiempo establecido por la solución anterior debe sincronizarse con el tiempo de espera de la sesión del lado del servidor. Si los dos no se sincronizan, puede encontrarse con problemas que frustrarán y confundirán a sus usuarios. Por ejemplo, el tiempo de espera de la sesión del lado del servidor puede establecerse en 60 minutos, pero el usuario puede creer que está seguro, porque la captura de tiempo inactivo de JavaScript ha aumentado la cantidad total de tiempo que un usuario puede pasar en una sola página. El usuario puede haber pasado tiempo completando un formulario largo y luego va a enviarlo. El tiempo de espera de la sesión puede comenzar antes de que se procese el envío del formulario. Tiendo a darles a mis usuarios 180 minutos, y luego use JavaScript para desconectar automáticamente al usuario. Esencialmente, usando parte del código anterior, para crear un temporizador simple, pero sin la parte de captura del evento del mouse. De esta manera, el tiempo del lado del cliente y del servidor se sincroniza perfectamente. No hay confusión, si muestra el tiempo al usuario en su interfaz de usuario, ya que se reduce. Cada vez que se accede a una nueva página en el CMS, se restablecen la sesión del lado del servidor y el temporizador de JavaScript. Simple y elegante Si un usuario permanece en una sola página durante más de 180 minutos, en primer lugar, creo que hay algo mal con la página. como se reduce Cada vez que se accede a una nueva página en el CMS, se restablecen la sesión del lado del servidor y el temporizador de JavaScript. Simple y elegante Si un usuario permanece en una sola página durante más de 180 minutos, en primer lugar, creo que hay algo mal con la página. como se reduce Cada vez que se accede a una nueva página en el CMS, se restablecen la sesión del lado del servidor y el temporizador de JavaScript. Simple y elegante Si un usuario permanece en una sola página durante más de 180 minutos, en primer lugar, creo que hay algo mal con la página.
fuente
JavaScript puro con tiempo de restablecimiento y enlaces configurados correctamente a través de
addEventListener
fuente
(Parcialmente inspirado por la buena lógica central de Equiman anteriormente en este hilo).
sessionExpiration.js
sessionExpiration.js es ligero pero efectivo y personalizable. Una vez implementado, use en una sola fila:
Este es un ejemplo de cómo se ve en acción, si no cambia el CSS.
fuente
Escribí un simple complemento jQuery que hará lo que estás buscando.
https://github.com/afklondon/jquery.inactivity
El script escuchará la inactividad del mouse, el teclado, el tacto y otros eventos personalizados (inactivo) y activará eventos globales de "actividad" e "inactividad".
Espero que esto ayude :)
fuente
Solo unos pocos pensamientos, una avenida o dos para explorar.
¿Es posible ejecutar una función cada 10 segundos y hacer que verifique una variable "contador"? Si eso es posible, puede tener un mouseover para la página, ¿no? Si es así, use el evento mouseover para restablecer la variable "contador". Si se llama a su función y el contador está por encima del rango predeterminado, realice su acción.
De nuevo, solo algunos pensamientos ... Espero que ayude.
fuente
He probado este archivo de trabajo de código:
fuente
Aquí está la mejor solución que he encontrado: http://css-tricks.com/snippets/jquery/fire-event-when-user-is-idle/
Aquí está el JS:
fuente
Puede usar la solución mencionada a continuación
fuente
Utilizo este enfoque, ya que no es necesario restablecer constantemente la hora en que se dispara un evento, en su lugar solo registramos la hora, esto genera el punto de inicio inactivo.
fuente
Probablemente podría detectar la inactividad en su página web utilizando los trucos de mousemove enumerados, pero eso no le dirá que el usuario no está en otra página en otra ventana o pestaña, o que el usuario está en Word o Photoshop, o WOW y simplemente no está mirando tu página en este momento. En general, solo haría la captación previa y confiaría en la multitarea del cliente. Si realmente necesita esta funcionalidad, puede hacer algo con un control ActiveX en Windows, pero en el mejor de los casos es feo.
fuente
Aquí hay un servicio AngularJS para lograr en Angular.
Tenga en cuenta que este verificador inactivo se ejecutará para todas las rutas, por lo que debe inicializarse
.run()
al cargar la aplicación angular. Luego puede usaridleChecker.secondsIdle
dentro de cada ruta.fuente
Debounce en realidad es una gran idea! Aquí la versión para proyectos gratuitos de jQuery:
fuente
Tan simple como puede ser, detecte cuando el mouse solo se mueve:
fuente
Bueno, puede adjuntar un evento de clic o movimiento del mouse al cuerpo del documento que restablece un temporizador. Tenga una función que llame a intervalos programados que verifique si el temporizador ha superado un tiempo específico (como 1000 milis) y comience su precarga.
fuente
Javascript no tiene forma de decir el uso de la CPU. Esto rompería el sandbox que se ejecuta JavaScript en su interior.
Aparte de eso, conectar los eventos onmouseover y onkeydown de la página probablemente funcionaría.
También puede establecer el uso de setTimeout en el evento onload para programar una función que se llamará después de un retraso.
fuente