Est-il possible de détecter le temps " inactif " en JavaScript?
Mon principal cas d'utilisation serait probablement de pré-récupérer ou de précharger du contenu.
Temps d'inactivité : période d'inactivité de l'utilisateur ou sans utilisation du processeur
javascript
Cherian
la source
la source
Réponses:
Voici un script simple utilisant JQuery qui gère les événements mousemove et keypress. Si le délai expire, la page se recharge.
la source
setInterval
, qui est ensuite évaluée comme JavaScript.idleTime++;
au lieu deidleTime = idleTime + 1;
'mousemove keydown click'
utiliser des indicateurs de bits (Event.MOUSEMOVE | Event.KEYDOWN | Event.CLICK
), car elles sont waaaaay plus rapides que les opérations de chaîne. Mais voulez-vous vraiment faire ça?Sans utiliser jQuery, uniquement du vanilla JavaScript:
Et lancez la fonction là où vous en avez besoin (par exemple: onPageLoad).
Vous pouvez ajouter plus d'événements DOM si vous en avez besoin. Les plus utilisés sont:
Ou enregistrez les événements souhaités à l'aide d'un tableau
Liste des événements DOM : http://www.w3schools.com/jsref/dom_obj_event.asp
N'oubliez pas d'utiliser
window
oudocument
selon vos besoins. Ici vous pouvez voir les différences entre eux: Quelle est la différence entre la fenêtre, l'écran et le document en Javascript?Le code mis à jour avec @ frank-conijn et @daxchen s'améliore:
window.onscroll
ne se déclenche pas si le défilement est à l'intérieur d'un élément déroulant, car les événements de défilement ne bouillonnent pas.window.addEventListener('scroll', resetTimer, true)
, le troisième argument indique à l'auditeur d'attraper l'événement pendant la phase de capture au lieu de la phase de bulle.la source
document.onload = function () { inactivityTime(); }; document.onmousedown = function () { inactivityTime(); }; document.onkeypress = function () { inactivityTime(); }; document.ontouchstart = function () { inactivityTime(); };
Amélioration de la réponse d'Equiman:
.
Mis à part les améliorations concernant la détection d'activité et le changement de
document
àwindow
, ce script appelle en fait la fonction, plutôt que de la laisser inactive.Il n'attrape pas directement l'utilisation du CPU, mais cela est impossible, car l'exécution d'une fonction provoque l'utilisation du CPU. Et l'inactivité des utilisateurs finit par entraîner une utilisation nulle du processeur, donc indirectement, elle n'attrape aucune utilisation du processeur.
la source
window.onscroll
cela ne se déclenchera pas si le défilement est à l'intérieur d'un élément déroulant, car les événements de défilement ne bouillonnent pas. En utilisantwindow.addEventListener('scroll', resetTimer, true)
, le troisième argument indique à l'auditeur d'attraper un événement pendant lacapture
phase au lieu de labubble
phase (IE> 8), voir cette réponsedocument.onscroll
le même problème, ne se déclenche pas si le défilement est à l'intérieur d'un enfant défilable?addEventListener
au lieu deonscroll
.J'ai créé une petite bibliothèque qui fait ça il y a un an:
https://github.com/shawnmclean/Idle.js
La description:
Les utilisateurs de Visual Studio peuvent l'obtenir auprès de NuGet en:
PM> Install-Package Idle.js
la source
Voici une implémentation jQuery approximative de l'idée de tvanfosson:
la source
setInterval
une chaîne! Donnez juste une fonction comme variable!setInterval()
évaluer l'expression dans la portée globale et donc ne trouvera pas latimerIncrement()
fonction qui est à l'intérieur de la fonction de gestionnaire .ready. C'est encore une autre raison de ne JAMAIS transmettre de chaînessetInterval()
. Passez simplement une référence de fonction réelle et vous n'aurez pas ce problème car ils sont évalués dans la portée actuelle.Similaire à la solution Iconic ci-dessus (avec événement personnalisé jQuery) ...
la source
Vous pouvez le faire plus élégamment avec le soulignement et le jquery -
la source
Ma réponse a été inspirée par la réponse de vijay , mais c'est une solution plus courte et plus générale que je pensais partager pour quiconque pourrait l'aider.
Dans sa forme actuelle, ce code s'exécutera immédiatement et rechargera votre page actuelle après 3 minutes sans mouvement de la souris ni appui sur les touches.
Cela utilise du JavaScript vanilla simple et une expression de fonction immédiatement invoquée pour gérer les délais d'inactivité d'une manière propre et autonome.
la source
onclick
affectation car elle n'est probablement pas nécessaire en plus deonmousemove
, mais évidemment, l'un de ces événements qui sont déclenchés par programme continuera de se réinitialiseridleCounter
. Je ne sais pas pourquoi vous simulez l'interaction utilisateur au lieu d'appeler simplement une fonction, mais si c'est quelque chose que vous devez faire pour une raison quelconque, cette réponse ne fonctionnera évidemment pas pour vous, pas plus que la plupart des autres réponses que je '' ai examiné cette question.Je sais que c'est une question relativement ancienne, mais j'ai eu le même problème et j'ai trouvé une assez bonne solution.
J'ai utilisé: jquery.idle et je n'avais qu'à faire:
Voir démo JsFiddle .
(Juste pour info: voir ceci pour le suivi des événements de back-end Leadload navigateur )
la source
keepTracking
option surfalse
. Si vous souhaitez réinitialiser, vous pouvez essayer de le réinitialiser. Voici un exemple modifié qui ne se déclencherait qu'une seule fois: jsfiddle.net/f238hchm/12Toutes les réponses précédentes ont un gestionnaire de déplacement de souris toujours actif. Si le gestionnaire est jQuery, le traitement supplémentaire effectué par jQuery peut s'additionner. Surtout si l'utilisateur utilise une souris de jeu, jusqu'à 500 événements par seconde peuvent se produire.
Cette solution évite de gérer chaque événement de déplacement de souris. Il en résulte une petite erreur de synchronisation, mais que vous pouvez ajuster à votre besoin.
http://jsfiddle.net/jndxq51o/
la source
$(startTimer)
équivalent à$(document).ready(startTimer)
garantit que le DOM est prêt avant de raccorder les événements mousemove et keypress.Vous pourriez probablement pirater quelque chose ensemble en détectant le mouvement de la souris sur le corps du formulaire et en mettant à jour une variable globale avec le dernier temps de mouvement. Vous devrez alors avoir un temporisateur d'intervalle qui vérifie périodiquement le dernier temps de mouvement et fait quelque chose s'il a été suffisamment long depuis que le dernier mouvement de souris a été détecté.
la source
J'ai écrit une petite classe ES6 pour détecter l'activité et autrement déclencher des événements en cas de délai d'inactivité. Il couvre le clavier, la souris et le toucher , peut être activé et désactivé et dispose d'une API très allégée:
Il ne dépend pas de jQuery, mais vous devrez peut-être l'exécuter via Babel pour prendre en charge les navigateurs plus anciens.
https://gist.github.com/4547ef5718fd2d31e5cdcafef0208096
Je pourrais le publier en tant que package npm une fois que j'aurai des commentaires.
la source
Si vous ciblez un navigateur pris en charge (Chrome ou Firefox à partir de décembre 2018), vous pouvez tester le requestIdleCallback et inclure le shim requestIdleCallback pour les navigateurs non pris en charge.
la source
Essayez ce code, il fonctionne parfaitement.
la source
Je pense que ce code jquery est parfait, bien que copié et modifié à partir des réponses ci-dessus !! donot a oublié d'inclure la bibliothèque jquery dans votre fichier!
la source
Le problème avec toutes ces solutions, bien que correctes, elles ne sont pas pratiques, si l'on prend en compte l'ensemble précieux de timeout de session, en utilisant PHP, .NET ou dans le fichier Application.cfc pour les développeurs Coldfusion. L'heure définie par la solution ci-dessus doit être synchronisée avec le délai d'expiration de la session côté serveur. Si les deux ne se synchronisent pas, vous pouvez rencontrer des problèmes qui ne feront que frustrer et dérouter vos utilisateurs. Par exemple, le délai d'expiration de la session côté serveur peut être défini sur 60 minutes, mais l'utilisateur peut croire qu'il est sûr, car la capture du temps d'inactivité JavaScript a augmenté le temps total qu'un utilisateur peut passer sur une seule page. L'utilisateur peut avoir passé du temps à remplir un long formulaire, puis va le soumettre. Le délai d'expiration de la session peut démarrer avant que la soumission du formulaire ne soit traitée. J'ai tendance à accorder 180 minutes à mes utilisateurs, puis utilisez JavaScript pour déconnecter automatiquement l'utilisateur. Essentiellement, en utilisant une partie du code ci-dessus, pour créer un minuteur simple, mais sans la partie d'événement de capture de la souris. De cette façon, mon temps côté client et côté serveur se synchronise parfaitement. Il n'y a pas de confusion, si vous affichez l'heure à l'utilisateur dans votre interface utilisateur, car cela réduit. Chaque fois qu'une nouvelle page est accessible dans le CMS, la session côté serveur et le minuteur JavaScript sont réinitialisés. Simple et élégant. Si un utilisateur reste sur une seule page pendant plus de 180 minutes, je pense qu'il y a un problème avec la page, en premier lieu. car il diminue. Chaque fois qu'une nouvelle page est accessible dans le CMS, la session côté serveur et le minuteur JavaScript sont réinitialisés. Simple et élégant. Si un utilisateur reste sur une seule page pendant plus de 180 minutes, je pense qu'il y a un problème avec la page, en premier lieu. car il diminue. Chaque fois qu'une nouvelle page est accessible dans le CMS, la session côté serveur et le minuteur JavaScript sont réinitialisés. Simple et élégant. Si un utilisateur reste sur une seule page pendant plus de 180 minutes, je pense qu'il y a un problème avec la page, en premier lieu.
la source
JavaScript pur avec un temps de réinitialisation et des liaisons correctement définis via
addEventListener
la source
(Partiellement inspiré par la bonne logique de base d'Equiman plus haut dans ce fil.)
sessionExpiration.js
sessionExpiration.js est léger mais efficace et personnalisable. Une fois implémenté, utilisez sur une seule ligne:
Ceci est un exemple de ce à quoi il ressemble en action, si vous ne changez pas le CSS.
la source
J'ai écrit un simple plugin jQuery qui fera ce que vous cherchez.
https://github.com/afklondon/jquery.inactivity
Le script écoutera la souris, le clavier, le toucher et d'autres événements personnalisés d'inactivité (inactifs) et déclenchera des événements globaux d '"activité" et "d'inactivité".
J'espère que cela t'aides :)
la source
Juste quelques réflexions, une ou deux pistes à explorer.
Est-il possible d'avoir une fonction exécutée toutes les 10 secondes, et de faire vérifier une variable "compteur"? Si c'est possible, vous pouvez avoir un survol de la page, n'est-ce pas? Si tel est le cas, utilisez l'événement mouseover pour réinitialiser la variable "compteur". Si votre fonction est appelée et que le compteur est au-dessus de la plage que vous prédéterminez, alors faites votre action.
Encore une fois, juste quelques réflexions ... J'espère que ça aide.
la source
J'ai testé ce fichier de travail de code:
la source
Voici la meilleure solution que j'ai trouvée: http://css-tricks.com/snippets/jquery/fire-event-when-user-is-idle/
Voici le JS:
la source
Vous pouvez utiliser la solution mentionnée ci-dessous
la source
J'utilise cette approche, car vous n'avez pas besoin de réinitialiser constamment l'heure à laquelle un événement se déclenche, mais nous enregistrons simplement l'heure, cela génère le point de départ inactif.
la source
Vous pourriez probablement détecter l'inactivité sur votre page Web à l'aide des astuces de déplacement de souris répertoriées, mais cela ne vous dira pas que l'utilisateur n'est pas sur une autre page dans une autre fenêtre ou un autre onglet, ou que l'utilisateur est dans Word ou Photoshop, ou WOW et ne regarde tout simplement pas votre page pour le moment. En général, je fais juste la prélecture et je compte sur le multitâche du client. Si vous avez vraiment besoin de cette fonctionnalité, vous faites quelque chose avec un contrôle ActiveX dans Windows, mais c'est moche au mieux.
la source
Voici un service AngularJS pour accomplir en Angular.
Gardez à l'esprit que ce vérificateur inactif s'exécutera pour toutes les routes, il doit donc être initialisé lors
.run()
du chargement de l'application angulaire. Ensuite, vous pouvez utiliseridleChecker.secondsIdle
à l'intérieur de chaque itinéraire.la source
Debounce en fait une excellente idée! Voici la version pour les projets gratuits jQuery:
la source
Aussi simple que possible, détectez uniquement les mouvements de la souris:
la source
Eh bien, vous pouvez attacher un événement de clic ou de déplacement de souris au corps du document qui réinitialise une minuterie. Avoir une fonction que vous appelez à des intervalles temporisés qui vérifie si la minuterie est sur une durée spécifiée (comme 1000 millis) et commencez votre préchargement.
la source
Javascript n'a aucun moyen de dire l'utilisation du processeur. Cela casserait les javascript du bac à sable à l'intérieur.
En dehors de cela, accrocher les événements onmouseover et onkeydown de la page fonctionnerait probablement.
Vous pouvez également définir use setTimeout dans l'événement onload pour planifier une fonction à appeler après un délai.
la source