93 votes

Détecter si l'événement de défilement a été créé par l'utilisateur

Est-il possible de savoir si un événement de défilement a été déclenché par le navigateur ou par l'utilisateur? Plus précisément, lors de l'utilisation du bouton retour, un navigateur peut sauter à la dernière position de défilement connue. Si je lie un événement de défilement, comment puis-je savoir si cela a été causé par l'utilisateur ou par le navigateur?

$(document).scroll( function(){ 
    //qui a fait cela ?!
});

Je distingue trois types de situations qui provoquent un défilement dans un navigateur.

  1. L'utilisateur effectue une action. Par exemple, utilise la molette de la souris, les touches de direction, les touches de page haut/bas, les touches de début/fin, clique sur la barre de défilement ou en fait glisser le curseur.
  2. Le navigateur défile automatiquement. Par exemple, lorsque vous utilisez le bouton retour dans votre navigateur, il sautera automatiquement à la dernière position de défilement connue.
  3. Le JavaScript effectue un défilement. Par exemple, element.scrollTo(x,y).

1 votes

Je ne suis pas sûr de votre question, si vous considérez le saut en utilisant le bouton retour vers moi un événement de défilement du navigateur ou de l'utilisateur. En général : Que considérez-vous comme "défilement par le navigateur" ? Si vous voulez dire le défilement initié par votre script, alors tout ce que vous avez à faire, c'est lorsque votre script défile, soit de désactiver le gestionnaire d'événements, soit de définir un indicateur pour que le gestionnaire d'événements sache l'ignorer.

0 votes

J'ai considéré le défilement via le bouton de retour comme un "défilement du navigateur". Tout autre chose - la molette de la souris, les flèches haut/bas, le clic sur le bouton central, etc. serait un défilement de l'utilisateur. Je suppose que ma vraie question pourrait être - y a-t-il un moyen de différencier d'où provient un événement ? J'ai regardé les propriétés sur l'objet événement, mais je n'ai rien trouvé. Les trois scénarios que je peux imaginer sont le défilement initié par le navigateur, le défilement initié par JavaScript et le défilement initié par l'utilisateur. J'espère que cela clarifie les choses.

0 votes

@mrtsherman J'ai trouvé certains de ces éléments tout en obtenant le même résultat : stackoverflow.com/questions/2834667/…

-1voto

nathan g Points 38

Si vous utilisez JQuery, il semble qu'il y ait une meilleure réponse - je suis en train de l'essayer moi-même.

voir: Détecter le déclenchement d'un événement JQuery par l'utilisateur ou par un appel de code

0 votes

Merci pour la suggestion. Cependant, ceci est une solution binaire - détecte le défilement initié par javascript par rapport au défilement sans js. J'ai vraiment besoin d'une solution ternaire (js, utilisateur, navigateur). Remarque annexe, jQuery n'est pas requis pour votre solution proposée.

-1voto

TimothyBuktu Points 943

Il pourrait ne pas aider avec votre application, mais j'avais besoin de déclencher un événement lorsque l'utilisateur fait défiler mais pas de manière programmée et je poste au cas où cela pourrait aider quelqu'un d'autre.

Écoutez l'événement wheel au lieu de scroll,

Il est déclenché chaque fois qu'un utilisateur utilise la molette de la souris ou le trackpad (ce qui est comment la plupart des gens font défiler de toute façon) et n'est pas déclenché lorsque vous faites défiler de manière programmatique. Je l'ai utilisé pour différencier entre une action de défilement par l'utilisateur et les fonctions de défilement.

https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event

element.addEventListener('wheel', (event) => {
       //faire des actions à partir du défilement de l'utilisateur ici
})

Un inconvénient est que wheel ne se déclenche pas lors du défilement sur mobile, donc j'ai vérifié si l'appareil était mobile et j'ai utilisé des fonctions similaires

if(this.mobile){
  element.addEventListener('scroll', (event) => {
       //faire des actions à partir du défilement sur mobile ici
  })
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X