8
votes

JQuery: Fire MouseMove Events moins souvent

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

edit: La réponse acceptée ci-dessous fonctionnerait Parfaitement pour cette situation, cependant, j'ai constaté que la fonctionnalité Mousestop () 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!


0 commentaires

9 Réponses :



4
votes

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 commentaires

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



0
votes

Pourquoi ne pas utiliser setInterval () au lieu des délais d'attente?


0 commentaires

1
votes

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 de l'extrait suivant: xxx


0 commentaires

18
votes

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


2 commentaires

+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?



1
votes

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);
    }
});


0 commentaires

3
votes

Un moyen simple d'obtenir la position de la souris dans une période personnalisée de millisecondes xxx


0 commentaires

2
votes

0 commentaires

2
votes

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; xxx

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.


0 commentaires