¿Cómo detectar el tiempo de inactividad en JavaScript con elegancia?


479

¿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


77
¿Cómo define TIEMPO IDLE?
Itay Moav -Malimovka


74
Casi el 50% de las respuestas aquí han utilizado jQuery para una tarea tan simple para Javascript puro. Está más allá de la tontería, especialmente porque el OP quería Javascript. Pida helado de fresa, pero obtenga un granero adosado en su lugar.
TheCarver

44
eso es StackOverflow para ti
robertmain

55
@TheCarver: tener que instalar una biblioteca jQuery para algo tan simple es realmente ridículo, y alarga el tiempo de procesamiento y aumenta el uso de energía. La gente debería desplazarse un poco más abajo. También hay una solución casi de copiar y pegar en Javascript vainilla.
Frank Conijn

Respuestas:


439

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.

<script type="text/javascript">
var idleTime = 0;
$(document).ready(function () {
    //Increment the idle time counter every minute.
    var idleInterval = setInterval(timerIncrement, 60000); // 1 minute

    //Zero the idle timer on mouse movement.
    $(this).mousemove(function (e) {
        idleTime = 0;
    });
    $(this).keypress(function (e) {
        idleTime = 0;
    });
});

function timerIncrement() {
    idleTime = idleTime + 1;
    if (idleTime > 19) { // 20 minutes
        window.location.reload();
    }
}
</script>   

16
Le falta un punto y coma después del cuerpo $ (document) .ready (function (). Además, en la llamada a setInterval, no funcionará con comillas alrededor del nombre de la función y no necesita los paréntesis después de él. Just: setInterval (timerIncrement, 60000)
Jesse Roper el

99
@Jesse: Tus sugerencias son buenas, así es como debería ser el código. Pero solo quería señalar que, incluso sin estos cambios, el código es completamente funcional. Los puntos y comas al final de una declaración de expresión son opcionales y, de hecho, puede pasar una cadena a setInterval, que luego se evalúa como JavaScript.
Felix Kling

66
Simplemente podría usar en idleTime++;lugar deidleTime = idleTime + 1;
Mike Causer

77
¿No es pesado en el sistema de un usuario? Digamos que un usuario con un navegador bastante antiguo en una PC no tan pesada, está trabajando en una aplicación de JavaScript durante medio día, y está procesando estas funciones cada vez que el usuario mueve su mouse ... Me pregunto si esto ganó ' t afectar la experiencia del usuario ...
Sander

55
@PietBinnenbocht Además, si comienzas a optimizar cosas como esta, también puedes cambiar todas las funciones que toman cadenas como '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?
Killah

362

Sin usar jQuery, solo JavaScript vainilla:

var inactivityTime = function () {
    var time;
    window.onload = resetTimer;
    // DOM Events
    document.onmousemove = resetTimer;
    document.onkeypress = resetTimer;

    function logout() {
        alert("You are now logged out.")
        //location.href = 'logout.html'
    }

    function resetTimer() {
        clearTimeout(time);
        time = setTimeout(logout, 3000)
        // 1000 milliseconds = 1 second
    }
};

E inicie la función donde la necesite (por ejemplo: onPageLoad).

window.onload = function() {
  inactivityTime(); 
}

Puede agregar más eventos DOM si es necesario. Los más utilizados son:

document.onload = resetTimer;
document.onmousemove = resetTimer;
document.onmousedown = resetTimer; // touchscreen presses
document.ontouchstart = resetTimer;
document.onclick = resetTimer;     // touchpad clicks
document.onkeypress = resetTimer;
document.addEventListener('scroll', resetTimer, true); // improved; see comments

O registre los eventos deseados utilizando una matriz

window.addEventListener('load', resetTimer, true);
var events = ['mousedown', 'mousemove', 'keypress', 'scroll', 'touchstart'];
events.forEach(function(name) {
 document.addEventListener(name, resetTimer, true); 
});

Lista de eventos DOM : http://www.w3schools.com/jsref/dom_obj_event.asp

Recuerde usar window, o documentsegú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.onscrollno 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.


58
Me gusta mucho el enfoque simple de JavaScript.
Manatax

44
Definitivamente, restablecer un temporizador es un enfoque más directo / intuitivo y preciso que tener un tiempo de espera para hacer lo suyo, solo para mantener un conteo entero de otra cosa, cuando el temporizador en sí mismo puede SER el contador (de alta precisión).
Josh Sutterfield

2
@mpsbhat solo agregue un console.log o una alerta y vea si funciona. O registre estos eventos:document.onload = function () { inactivityTime(); }; document.onmousedown = function () { inactivityTime(); }; document.onkeypress = function () { inactivityTime(); }; document.ontouchstart = function () { inactivityTime(); };
equiman

2
Si ... trabajando. jsfiddle.net/mpsbhat/6b6mja5t/1 . Gracias @equiman
mpsbhat

66
Sería mucho mejor tener una bandera var notidle; establece esa bandera = verdadero solo en los eventos. Luego, en la función resetTimer, compruebe si el indicador de notidle es verdadero, si se restablece el temporizador o si se cierra la sesión. Esto eliminará la complejidad sobrecarga de restablecer constantemente el temporizador.
MartinWebb

75

Mejorando la respuesta de Equiman:

function idleLogout() {
    var t;
    window.onload = resetTimer;
    window.onmousemove = resetTimer;
    window.onmousedown = resetTimer;  // catches touchscreen presses as well      
    window.ontouchstart = resetTimer; // catches touchscreen swipes as well 
    window.onclick = resetTimer;      // catches touchpad clicks as well
    window.onkeypress = resetTimer;   
    window.addEventListener('scroll', resetTimer, true); // improved; see comments

    function yourFunction() {
        // your function for too long inactivity goes here
        // e.g. window.location.href = 'logout.php';
    }

    function resetTimer() {
        clearTimeout(t);
        t = setTimeout(yourFunction, 10000);  // time is in milliseconds
    }
}
idleLogout();

.
Además de las mejoras con respecto a la detección de actividad y el cambio de documenta window, 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.


3
Solo quería señalar que window.onscrollno se disparará si el desplazamiento está dentro de un elemento desplazable, porque los eventos de desplazamiento no burbujean. Usando window.addEventListener('scroll', resetTimer, true), el tercer argumento le dice al oyente que capture el evento durante la capturefase en lugar de la bubblefase (IE> 8), vea esta respuesta
DaxChen el

@DaxChen: ¿no document.onscrolltiene el mismo problema, no disparar si el desplazamiento está dentro de un elemento desplazable?
Frank Conijn

2
Sí, el punto que estaba diciendo es usar en addEventListenerlugar de onscroll.
DaxChen

@DaxChen - OK, me preguntaba si querías decir eso, para solucionarlo, pero ahora está claro. Edité la respuesta en consecuencia. Gracias por el comentario.
Frank Conijn

Actualizaré mi respuesta con esta información importante, para evitar otra copia y pegar mi error. Gracias @DaxChen y Frank
equiman

33

Creé una pequeña biblioteca que hace esto hace un año:

https://github.com/shawnmclean/Idle.js

Descripción:

Pequeña biblioteca de JavaScript para informar de la actividad del usuario en el navegador (ausente, inactivo, sin mirar la página web, en una pestaña diferente, etc.). que es independiente de cualquier otra biblioteca de javascript como jquery.

Los usuarios de Visual Studio pueden obtenerlo de NuGet de la siguiente manera: PM> Install-Package Idle.js


32

Aquí hay una implementación aproximada de jQuery de la idea de tvanfosson:

$(document).ready(function(){

   idleTime = 0;

   //Increment the idle time counter every second.
   var idleInterval = setInterval(timerIncrement, 1000);

   function timerIncrement()
   {
     idleTime++;
     if (idleTime > 2)
     {
       doPreload();
     }
   }

   //Zero the idle timer on mouse movement.
   $(this).mousemove(function(e){
      idleTime = 0;
   });

   function doPreload()
   {
     //Preload images, etc.
   }

})

99
Esta solución no considera los eventos del teclado.
Daniel Silveira

77
¡Nunca pases setIntervaluna cuerda! ¡Solo asigne una función como variable!
Eric

1
En realidad, esto no funcionará porque pasar una cadena para setInterval()evaluar la expresión en el ámbito global y, por lo tanto, no encontrará la timerIncrement()función que está dentro de la función de controlador .ready. Esta es otra razón para NUNCA pasar cadenas a setInterval(). Simplemente pase una referencia de función real y no tendrá este problema porque se evalúan en el ámbito actual.
jfriend00

Gracias, no era consciente de la necesidad de NUNCA pasar cadenas a setInterval. Actualicé mi respuesta.
Peter J

24

Similar a la solución de Iconic anterior (con evento personalizado jQuery) ...

// use jquery-idle-detect.js script below
$(window).on('idle:start', function(){
  //start your prefetch etc here...
});

$(window).on('idle:stop', function(){
  //stop your prefetch etc here...
});

//jquery-idle-detect.js
(function($,$w){
  // expose configuration option
  // idle is triggered when no events for 2 seconds
  $.idleTimeout = 2000;

  // currently in idle state
  var idle = false;

  // handle to idle timer for detection
  var idleTimer = null;

  //start idle timer and bind events on load (not dom-ready)
  $w.on('load', function(){
    startIdleTimer();
    $w.on('focus resize mousemove keyup', startIdleTimer)
      .on('blur',idleStart) //force idle when in a different tab/window
      ;
  ]);

  function startIdleTimer() {
    clearTimeout(idleTimer); //clear prior timer

    if (idle) $w.trigger('idle:stop'); //if idle, send stop event
    idle = false; //not idle

    var timeout = ~~$.idleTimeout; // option to integer
    if (timeout <= 100) timeout = 100; // min 100ms
    if (timeout > 300000) timeout = 300000; // max 5 minutes

    idleTimer = setTimeout(idleStart, timeout); //new timer
  }

  function idleStart() {
    if (!idle) $w.trigger('idle:start');
    idle = true;
  }

}(window.jQuery, window.jQuery(window)))

20

Puedes hacerlo más elegantemente con guión bajo y jquery -

$('body').on("click mousemove keyup", _.debounce(function(){
    // do preload here
}, 1200000)) // 20 minutes debounce

16

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.

(function () { 
    var minutes = true; // change to false if you'd rather use seconds
    var interval = minutes ? 60000 : 1000; 
    var IDLE_TIMEOUT = 3; // 3 minutes in this example
    var idleCounter = 0;

    document.onmousemove = document.onkeypress = function () {
        idleCounter = 0;
    };

    window.setInterval(function () {
        if (++idleCounter >= IDLE_TIMEOUT) {
            window.location.reload(); // or whatever you want to do
        }
    }, interval);
}());

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.


document.onclick considera las funciones de javascript usando .trigger ('clic') que escribí como automatizado. Por lo tanto, no es realmente una interacción del usuario, pero en este caso restablecerá el idleCounter
Carmela

@Carmela: No estoy segura de por qué solo estoy viendo esto; Debo haberlo perdido. Gracias, eliminé la onclickasignación ya que probablemente no sea necesaria además de onmousemove, pero obviamente cualquiera de estos eventos que se activan mediante programación continuará restableciéndose idleCounter. 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.
johnnyRose

15

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:

$(document).idle({
  onIdle: function(){
    alert('You did nothing for 5 seconds');
  },
  idle: 5000
})

Ver demostración de JsFiddle .

(Solo para información: vea esto para el seguimiento de eventos de back-end Leads browserloadload )


¿Cómo puedo detener esta función? Indicaron un evento inactivo: detener pero honestamente no sé cómo usar esto. Quiero que si me muevo a la página siguiente (basado en ajax, por lo que solo se actualizó un fragmento de la página HTML), la función inactiva se detiene. ¿Sabías cómo lograr esto?
Mubasher

Aquí dice: "inactivo: detener": detendrá y eliminará el seguimiento de usuarios
DDan

Ya he leído pero no pude encontrar la manera de usar esto, ¿podrían ayudarme?
Mubasher

Si desea que se active solo una vez, puede establecer la keepTrackingopción en false. Si desea restablecer, puede intentar reiniciarlo. Aquí hay un ejemplo modificado que se dispararía solo una vez: jsfiddle.net/f238hchm/12
DDan

No, no disparo una vez, keepTracking debería ser cierto, pero en la navegación a otra página quiero detener esto
Mubasher

15

Todas 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.

function setIdleTimeout(millis, onIdle, onUnidle) {
    var timeout = 0;
    startTimer();

    function startTimer() {
        timeout = setTimeout(onExpires, millis);
        document.addEventListener("mousemove", onActivity);
        document.addEventListener("keydown", onActivity);
    }

    function onExpires() {
        timeout = 0;
        onIdle();
    }

    function onActivity() {
        if (timeout) clearTimeout(timeout);
        else onUnidle();
        //since the mouse is moving, we turn off our event hooks for 1 second
        document.removeEventListener("mousemove", onActivity);
        document.removeEventListener("keydown", onActivity);
        setTimeout(startTimer, 1000);
    }
}

http://jsfiddle.net/jndxq51o/


1
¿Funcionará automáticamente si se coloca en una página, o debe estar dentro de un contenedor $ (document) .ready ()? ¡Gracias! Además, ¿dónde está la parte que realiza una acción cuando expira el temporizador?
Naranjas13

1
Puede llamar a esto en cualquier momento, incluso antes de que el documento esté listo. Pasa una función 'devolución de llamada' que se llamará cuando expire el temporizador.
Zarzaparrilla

1
Esto $(startTimer)es equivalente a $(document).ready(startTimer), asegura que el DOM esté listo antes de enganchar el mousemove y presionar los eventos.
Zarzaparrilla

1
+1 Esto es lo que hago: los controladores de movimiento del mouse contribuyen a la lentitud y a la reducción de la duración de la batería, por lo que solo encenderlo periódicamente es una gran idea si puede permitirse el menor error de sincronización. Por lo general, uso la detección de tiempo de inactividad para las advertencias automáticas de caducidad de la sesión (por ejemplo, "¿Todavía estás allí?"), Por lo que tiendo a tener muchos minutos antes de que un usuario quede "inactivo", en cuyo caso un pequeño error de temporización es totalmente irrelevante.
cabra

1
Es mejor usar "keydown" que "keypress" porque las teclas de flecha no son detectadas por el evento "keypress". Por lo tanto, si el usuario está navegando por la página con las teclas de flecha, de todos modos quedará inactivo.
aFerrer

13

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.


Es importante tener en cuenta que el script solo podrá detectar movimiento en el cuerpo de la página, no todas las entradas del usuario. No creo que haya una manera de obtener información de la CPU o del proceso de JavaScript.
Dave Swersky

1
Me tomé la libertad de implementar tu idea en jQuery.
Peter J

9

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:

const timer = new IdleTimer(() => alert('idle for 1 minute'), 1000 * 60 * 1);
timer.activate();

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.


8

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.


¿Y dejar en paz a los otros navegadores?
Frank Conijn

La cuña cubre todos los navegadores. ¡Y esta fue la única respuesta! Otras respuestas más lentas son sobre el mouse. La interactividad o CPU solo se dijo como un ejemplo. ¿Cómo detectar la CPU inactiva con una solución de mouse?

6

Prueba este código, funciona perfectamente.

var IDLE_TIMEOUT = 10; //seconds
var _idleSecondsCounter = 0;

document.onclick = function () {
    _idleSecondsCounter = 0;
};

document.onmousemove = function () {
    _idleSecondsCounter = 0;
};

document.onkeypress = function () {
    _idleSecondsCounter = 0;
};

window.setInterval(CheckIdleTime, 1000);

function CheckIdleTime() {
    _idleSecondsCounter++;
    var oPanel = document.getElementById("SecondsUntilExpire");
    if (oPanel)
        oPanel.innerHTML = (IDLE_TIMEOUT - _idleSecondsCounter) + "";
    if (_idleSecondsCounter >= IDLE_TIMEOUT) {
        alert("Time expired!");
        document.location.href = "SessionExpired.aspx";
    }
}

más 1 por ser vanilla js
frostymarvelous

5
<script type="text/javascript">
var idleTime = 0;
$(document).ready(function () {
    //Increment the idle time counter every minute.
    idleInterval = setInterval(timerIncrement, 60000); // 1 minute

    //Zero the idle timer on mouse movement.
    $('body').mousemove(function (e) {
     //alert("mouse moved" + idleTime);
     idleTime = 0;
    });

    $('body').keypress(function (e) {
      //alert("keypressed"  + idleTime);
        idleTime = 0;
    });



    $('body').click(function() {
      //alert("mouse moved" + idleTime);
       idleTime = 0;
    });

});

function timerIncrement() {
    idleTime = idleTime + 1;
    if (idleTime > 10) { // 10 minutes

        window.location.assign("http://www.google.com");
    }
}
</script> 

¡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!


4

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.


1
Sí, es por eso que solo hago esto después de deshacerme de las sesiones del lado del servidor y cargar todo desde archivos html.
Dan Parker

4

JavaScript puro con tiempo de restablecimiento y enlaces configurados correctamente a través de addEventListener

(function() {

  var t,
    timeout = 5000;

  function resetTimer() {
    console.log("reset: " + new Date().toLocaleString());
    if (t) { 
      window.clearTimeout(t); 
    }
    t = window.setTimeout(logout, timeout);
  }

  function logout() {
    console.log("done: " + new Date().toLocaleString());
  }
  resetTimer();

  //And bind the events to call `resetTimer()`
  ["click", "mousemove", "keypress"].forEach(function(name) {
    console.log(name);
    document.addEventListener(name, resetTimer);
  });

}());

4

(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:

sessionExpiration(idleMinutes, warningMinutes, logoutUrl);
  • Afecta a todas las pestañas del navegador, no solo a una.
  • Escrito en JavaScript puro , sin dependencias. Completamente del lado del cliente.
  • (Si así lo desea). Tiene un banner de advertencia y un reloj de cuenta regresiva , que se cancela por la interacción del usuario.
  • Simplemente incluya sessionExpiration.js y llame a la función, con argumentos [1] número de minutos inactivos (en todas las pestañas) hasta que el usuario cierre la sesión, [2] número de minutos inactivos hasta que se muestre la advertencia y la cuenta regresiva, y [3] URL de cierre de sesión.
  • Ponga el CSS en su hoja de estilo. Personalízalo si quieres. (O saltee y elimine el banner si no lo desea).
  • Si haces desea que el mensaje de advertencia sin embargo, entonces debe poner div vacío con ID sessExpirDiv en su página (una sugerencia es ponerlo en el pie de página) .
  • Ahora el usuario cerrará sesión automáticamente si todas las pestañas han estado inactivas durante el tiempo dado.
  • Opcional: puede proporcionar un cuarto argumento (URL serverRefresh) a la función, de modo que un temporizador de sesión del lado del servidor también se actualice cuando interactúa con la página.

Este es un ejemplo de cómo se ve en acción, si no cambia el CSS.

demo_image


3

Escribí un simple complemento jQuery que hará lo que estás buscando.

https://github.com/afklondon/jquery.inactivity

$(document).inactivity( {
    interval: 1000, // the timeout until the inactivity event fire [default: 3000]
    mouse: true, // listen for mouse inactivity [default: true]
    keyboard: false, // listen for keyboard inactivity [default: true]
    touch: false, // listen for touch inactivity [default: true]
    customEvents: "customEventName", // listen for custom events [default: ""]
    triggerAll: true, // if set to false only the first "activity" event will be fired [default: false]
});

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 :)


¿Existe realmente la necesidad de un retraso, no está activando un evento personalizado desde un controlador de eventos personalizado suficiente?
Hibou57

2

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.


2

He probado este archivo de trabajo de código:

var timeout = null;
    var timee = '4000'; // default time for session time out.
    $(document).bind('click keyup mousemove', function(event) {

    if (timeout !== null) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(function() {
              timeout = null;
            console.log('Document Idle since '+timee+' ms');
            alert("idle window");
        }, timee);
    });

2

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:

idleTimer = null;
idleState = false;
idleWait = 2000;

(function ($) {

    $(document).ready(function () {

        $('*').bind('mousemove keydown scroll', function () {

            clearTimeout(idleTimer);

            if (idleState == true) { 

                // Reactivated event
                $("body").append("<p>Welcome Back.</p>");            
            }

            idleState = false;

            idleTimer = setTimeout(function () { 

                // Idle Event
                $("body").append("<p>You've been idle for " + idleWait/1000 + " seconds.</p>");

                idleState = true; }, idleWait);
        });

        $("body").trigger("mousemove");

    });
}) (jQuery)

2

Puede usar la solución mencionada a continuación

var idleTime;
$(document).ready(function () {
         reloadPage();
        $('html').bind('mousemove click mouseup mousedown keydown keypress keyup submit change mouseenter scroll resize dblclick', function () {
            clearTimeout(idleTime);
            reloadPage();
        });
});
function reloadPage() {
    clearTimeout(idleTime);
    idleTime = setTimeout(function () {
        location.reload();
    }, 3000);
}

2

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.

           function idle(WAIT_FOR_MINS, cb_isIdle) {
            var self = this, 
                idle,
                ms = (WAIT_FOR_MINS || 1) * 60000,
                lastDigest = new Date(),
                watch;
            //document.onmousemove = digest;
            document.onkeypress = digest;
            document.onclick = digest;

            function digest() {
               lastDigest = new Date(); 
            }
            // 1000 milisec = 1 sec
            watch = setInterval(function(){
                if (new Date() - lastDigest > ms && cb_isIdel) {
                    clearInterval(watch);
                    cb_isIdle();
                }

            }, 1000*60);    
        },

1

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.


1

Aquí hay un servicio AngularJS para lograr en Angular.

/* Tracks now long a user has been idle.  secondsIdle can be polled 
   at any time to know how long user has been idle. */
fuelServices.factory('idleChecker',['$interval', function($interval){
    var self = {
        secondsIdle: 0,
        init: function(){
            $(document).mousemove(function (e) {
                self.secondsIdle = 0;
            });
            $(document).keypress(function (e) {
                self.secondsIdle = 0;
            });
            $interval(function(){
                self.secondsIdle += 1;
            }, 1000)
        }
    }
    return self;
}]);

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 usar idleChecker.secondsIdledentro de cada ruta.

myApp.run(['idleChecker',function(idleChecker){
    idleChecker.init();
}]);

1

Debounce en realidad es una gran idea! Aquí la versión para proyectos gratuitos de jQuery:

const derivedLogout = createDerivedLogout(30);
derivedLogout(); // it could happen that user too idle)
window.addEventListener('click', derivedLogout, false);
window.addEventListener('mousemove', derivedLogout, false);
window.addEventListener('keyup', derivedLogout, false); 

function createDerivedLogout (sessionTimeoutInMinutes) {
    return _.debounce( () => {
        window.location = this.logoutUrl;
    }, sessionTimeoutInMinutes * 60 * 1000 ) 
}

1

Tan simple como puede ser, detecte cuando el mouse solo se mueve:

var idle = false;

document.querySelector('body').addEventListener('mousemove', function(e) {
    if(idle!=false)idle = false;
});

var idleI = setInterval(function()
{   
    if(idle == 'inactive')
    {
        return;
    }

    if(idle == true)
    {
        idleFunction();
        idle = 'inactive';
        return;
    }

    idle = true;
}, 30000);// half the expected time, idle will trigger after 60s in this case.

function idleFuntion()
{
   console.log('user is idle');
}

0

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.


0

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.

// Call aFunction after 1 second
window.setTimeout(aFunction, 1000);

3
Me pregunto por qué tantos votos negativos en esta respuesta. Por lo que puedo ver, respondió la pregunta formulada, y es objetivamente correcta. Solo que no desplegué ejemplos de código elaborados.
Ifedi Okonkwo

1
Ahora es posible llamar a una función de JavaScript cuando "hay tiempo libre al final de un marco o cuando el usuario está inactivo". Developers.google.com/web/updates/2015/08/…
Max

setTimeout 0 es probablemente más correcto para calcular en promedio qué tan lleno está el búfer por el tiempo entre FILO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.