Une façon de résoudre ce problème est de définir un intervalle de temps et de ne traiter un événement de défilement qu'une fois dans cet intervalle de temps. Si plusieurs événements de défilement surviennent pendant cet intervalle de temps, vous les ignorez et ne les traitez qu'une fois cet intervalle écoulé.
var scrollTimer, lastScrollFireTime = 0;
$(window).on('scroll', function() {
var minScrollTime = 100;
var now = new Date().getTime();
function processScroll() {
console.log(new Date().getTime().toString());
}
if (!scrollTimer) {
if (now - lastScrollFireTime > (3 * minScrollTime)) {
processScroll(); // fire immediately on first scroll
lastScrollFireTime = now;
}
scrollTimer = setTimeout(function() {
scrollTimer = null;
lastScrollFireTime = new Date().getTime();
processScroll();
}, minScrollTime);
}
});
Cela déclenchera immédiatement le premier événement de défilement, puis vous obtiendrez un événement de défilement environ toutes les 100 ms pendant que la barre de défilement est déplacée, puis un événement final après que la barre de défilement a cessé de se déplacer. Vous pouvez ajuster la fréquence de l'événement en modifiant l'argument de la fonction setTimeout
(ce qui est actuellement fixé à 100).
Il y a une démo ici : http://jsfiddle.net/jfriend00/EBEqZ/ Vous devez ouvrir une fenêtre de console de débogage, commencer à déplacer la barre de défilement dans la fenêtre de contenu, puis observer l'heure de chaque événement de défilement dans la fenêtre de console de débogage. Dans ma version de Chrome, l'espacement minimal est de 100 ms et les événements semblent se produire toutes les 100 à 200 ms.