J'essaie de trouver un moyen propre d'agréger les événements de MouseMove afin que je assure que mon code soit appelé, mais une fois tous les 250 à 300 millisecondes.
J'ai pensé à utiliser quelque chose comme ce qui suit, mais se demandait s'il y avait un meilleur modèle, ou quelque chose que JQuery fournit cela fera la même chose: p> edit: strong> La réponse acceptée ci-dessous fonctionnerait Parfaitement pour cette situation, cependant, j'ai constaté que la fonctionnalité Mousestop () Code> fournie dans la réponse a effectivement éliminé ma nécessité d'agrégation, donc si vous lisez cette question et cherche une réponse, voir si Le plugin est ce dont vous avez vraiment besoin! p> p>
9 Réponses :
Votre code est bon, sauf que vous devriez Effacer le délai d'attente avant de la définir à NULL ou cela pourrait fuir: comme une alternative que vous pouvez utiliser Mousemove / Mousestop en conjonction avec window.setInterval < / a> p>
+1 - Merci pour la pointe! Est-ce le meilleur / le meilleur moyen? On dirait un peu de hack ...
Oui, c'est un peu un piratage, window.setInterval code> serait plus adapté à ce scénario.
Accepté! - se passe, la fonction Mousestop code> est exactement ce dont j'ai besoin et éliminera entièrement le code temporel. Merci beaucoup!
Quelque chose n'est pas correct avec cette approche: si la souris continue de bouger constamment, l'événement Mousemove continue de se faire tirer, mais les coordonnées de la souris restent les mêmes.
une solution et une question ^^
Qu'en est-il de cette approche sans Var global. Est-ce une solution appropriée? P>
$(function() { $("#foo").mousemove((function() { var timer = null; return function() { if (timer !== null) { window.clearTimeout(timer); } timer = window.setTimeout(foo, 250); }; })()); }); function foo() { //... }
+1 - J'aime vraiment n'utiliser aucune variable globale. Bien que je n'ai pas essayé ce code, il a l'air assez propre et intuitif.
C'était une question vraiment intéressante. J'ai trouvé une façon moins pirate de faire cela, et vous pouvez consulter ce Démo en direct forte> de l'extrait suivant:
Après avoir essayé la solution dans la réponse acceptée, j'ai découvert que si la souris continue de bouger constamment, en particulier en mouvement circulaire, l'événement Mousemove () est tiré en continu, mais les coordonnées de la souris restent les mêmes. Je suis donc proposé une solution plus simple qui élimine la mousestop () et la sécurité.
$("body").mousemove(function (e) { if (enableHandler) { handleMouseMove(e); enableHandler = false; } }); timer = window.setInterval(function(){ enableHandler = true; }, 100);
+1 - Merci! C'est en fait le type de solution que je cherchais à l'origine. C'est une approche beaucoup plus propre que la réponse acceptée, mais le plug-in Mousestop est toujours ce que je suis allé.
Y a-t-il un moyen d'arrêter la minuterie quand la souris ne bouge pas?
Vous pouvez enregistrer quelques lignes à l'aide du délai d'attente sur NULL la minuterie:
var paused = null; $("body").mousemove(function (e) { if (!paused){ /** your code here **/ paused = setTimeout(function(){paused=null}, 250); } });
Un moyen simple d'obtenir la position de la souris dans une période personnalisée de millisecondes
Vous cherchez du code à l'étranglement / débondonnement.
http://benalman.com / Projets / JQuery-THROTTLE-DEBONCE-PlugIN / http://drupalmerotion.com/article/debounoun-etand-throttle-visual-explanation p>
échantillon de soussecore.js p>
Je sais que je suis un peu tard à la fête, mais il pourrait être utile de visiter ce fil, voici mes 2 cents.
Utilisation de l'opérateur de modulus et des incréments de numéros simples, vous pouvez accélérer la cuisson Taux de votre fonction avec une performance minimale, comme vous; p> En outre, si vous avez peur de frapper la limite d'entier max, vous pouvez réinitialiser la variable tirée tous les x mille coups (à nouveau, à l'aide de l'opérateur de modulus) ou en utilisant l'événement de la souris. P> p>