Disons que j'ai un événement scroll / wheel comme celui-ci:
container.addEventListener("wheel", (e) => { const isScrollingDown = Math.sign(e.wheelDeltaY); // call some function once, don't listen for wheel event anymore // then listen for event again when done }
Basé sur deltaY, je détecte si un utilisateur fait défiler vers le bas ou vers le haut. Comment pourrais-je appeler une fonction une seule fois lorsque je la détecte (ce qui est immédiat), supprimer l'écouteur d'événements, puis l'écouter à nouveau lorsque ma fonction est terminée?
Je ne peux pas supprimer l'écouteur d'événements de l'intérieur de mon écouteur d'événements, n'est-ce pas?
Merci d'avance.
3 Réponses :
vous pouvez définir la variable de chargement et vérifier à chaque fois avant d'exécuter la fonction
var loading = false container.addEventListener("wheel", (e) => { const isScrollingDown = Math.sign(e.wheelDeltaY); if(!loading){ loading = true; // call some function once, don't listen for wheel event anymore // then listen for event again when done // after done loading = false } }
Wow, une implémentation si simple, je suppose que je pensais trop compliquée. Je vais essayer ceci, et si cela fonctionne, je le marquerai comme la bonne réponse, merci.
attendez 1 seconde après la première roue:
<div id="container" >wheel</div>
function handleWheel(e){ console.log(Math.random()) document.getElementById("container").removeEventListener("wheel", handleWheel) setTimeout(()=>{ document.getElementById("container").addEventListener("wheel", handleWheel); },1000); // return event after 1 second } document.getElementById("container").addEventListener("wheel", handleWheel)
Je n'ai pas vraiment envie d'utiliser setTimeout pour des trucs comme ça, étant donné que je travaille avec des animations.
"une fois dans une certaine période de temps?" tu as demandé ça
Oui, une certaine période de temps étant le temps après que ma fonction soit terminée. C'est donc en partie une mauvaise description, ma faute, et votre réponse est correcte pour cette partie, mais si vous lisez mieux mon problème, vous verrez que les implémentations ci-dessus sont en fait plus propres.
Vous pouvez utiliser la fonction removeEventListener ()
. documentation
exemple:
let wheelHandler = function(e) { toggleListener(wheelHandler, false) const isScrollingDown = Math.sign(e.wheelDeltaY); // call some function once, don't listen for wheel event anymore // then listen for event again when done toggleListener(wheelHandler, true) }; let toggleListener = function(listener, add) { if (add) { container.addEventListener("wheel", wheelHandler) } else { container.removeEventListener("wheel", wheelHandler) } } toggleListener(wheelHandler, true);