jQuery: Feu mousemove événements de moins en moins souvent
J'essaie de trouver un moyen propre à agréger mousemove des événements afin que je m'assurer que mon code est appelée, mais seulement une fois tous les 250 à 300 millisecondes.
J'ai pensé à utiliser quelque chose comme ce qui suit, mais je me demandais si il y avait un meilleur modèle, ou quelque chose de jQuery offre qui fera la même chose:
var mousemove_timeout = null;
$('body').mousemove(function() {
if (mousemove_timeout == null) {
mousemove_timeout = window.setTimeout(myFunction, 250);
}
});
function myFunction() {
/*
* Run my code...
*/
mousemove_timeout = null;
}
EDIT: La accepté de répondre ci-dessous fonctionne parfaitement pour cette situation, cependant, j'ai trouvé que le mousestop()
fonctionnalités fournies dans la réponse effectivement éliminé mon besoin pour l'agrégation, donc si vous êtes à la lecture de cette question et la recherche d'une réponse, voir si le mousestop plugin est ce que vous avez vraiment besoin!
OriginalL'auteur Topher Fangio | 2011-01-10
Vous devez vous connecter pour publier un commentaire.
Votre code est bien sauf que vous devez effacer l'expiration avant de le mettre à null ou il pourrait fuir:
Comme alternative, vous pouvez utiliser mousemove/mousestop en conjonction avec de la fenêtre.setInterval
Oui en effet c'est un peu un hack,
window.setInterval
serait plus adapté à ce scénario.Accepté! - S'avère, la
mousestop
fonction est exactement ce dont j'ai besoin et vous permettra d'éliminer le code d'expiration entièrement. Merci beaucoup!Quelque chose cloche avec cette approche: si la souris garder se déplaçant sans cesse, événement mousemove garder de se faire licencier, mais les coordonnées de la souris restent les mêmes.
OriginalL'auteur Darin Dimitrov
Après j'ai essayé la solution dans l'acceptation réponse, j'ai trouvé que si la souris continuer à avancer sans cesse, surtout dans un mouvement circulaire, mousemove() événement est déclenché en continu, mais les coordonnées de la souris restent les mêmes.
Donc, je suis venu avec une solution plus simple qui élimine mousestop() et setTimeout.
Ce sera bien appeler handleMouseMove() environ toutes les 100 millisecondes. (Notez que j'ai dit à peu près car les retards et les intervalles dans le JavaScript n'est pas en temps réel de la garantie)
Est-il un moyen pour arrêter le chronomètre lorsque la souris n'est pas en mouvement?
OriginalL'auteur Ethan
Une solution et une question^^
Quoi au sujet de cette approche sans un mondial var. Est que une solution adaptée?
+1 Meilleure solution
OriginalL'auteur Andreas
Un moyen simple de gettin la position de la souris personnalisé dans un délai de milisecondes
OriginalL'auteur chilljul
Vous cherchez code de la Limitation /anti-Rebond.
http://benalman.com/projects/jquery-throttle-debounce-plugin/
http://drupalmotion.com/article/debounce-and-throttle-visual-explanation
Échantillon de underscore.jS
OriginalL'auteur skibulk
Je sais que je suis un peu en retard à la fête, mais il pourrait être utile à des personnes qui visitent ce thread, ici, c'est mes 2 cents.
À l'aide de l'opérateur de modulo et simple nombre augmente, vous pouvez limiter la cadence de tir de votre fonction avec un minimum de performances, comme;
En outre, si vous avez peur de frapper le max entier limite, vous pouvez réinitialiser le tiré variable tous les X milliers de frappe (encore une fois, à l'aide de l'opérateur de modulo) ou à l'aide de l'événement mouseout.
OriginalL'auteur Thieu
C'était vraiment une question intéressante. J'ai trouvé un moins hackish façon de le faire, et vous pouvez consulter cette démo de l'extrait de code suivant:
OriginalL'auteur mekwall
Vous pouvez économiser quelques lignes en utilisant le timeout d'annuler la minuterie:
OriginalL'auteur Peter Hollingsworth
Pourquoi ne pas utiliser setInterval() au lieu de délais d'attente?
OriginalL'auteur hardyharzen