2009-02-12 5 views
1

Je voudrais avoir un feu de gestionnaire chaque fois que l'utilisateur fait défiler, mais je ne veux pas que cela se produise lorsque le navigateur défile au nom de l'utilisateur. Par exemple, le document ci-dessous fait défiler lui-même dans le cadre de onload. Cela déclenche mon gestionnaire de défilement, mais je ne le veux pas. Même si je supprime l'onload, il y a toujours un problème: si l'utilisateur fait défiler puis recharge la page, le gestionnaire se déclenche lors du rechargement. Encore une fois, je ne le veux pas.Comment détecter si un événement onscroll a été généré par programme?

Le gestionnaire peut-il détecter qui a provoqué son déclenchement?

<html> 
<body onscroll="alert('scroll detected')" 
     onload="window.scrollBy(0, document.height)"> 
    aaa<br/>bbb<br/>ccc<br/>ddd<br/>eee<br/>fff<br/>ggg<br/>hhh<br/>iii<br/> 
    jjj<br/>kkk<br/>lll<br/>mmm<br/>nnn<br/>ooo<br/>ppp<br/>qqq<br/>rrr<br/> 
    sss<br/>ttt<br/>uuu<br/>vvv<br/>www<br/>xxx<br/>yyy<br/>zzz 
</body> 
</html> 
+0

L'une des réponses ci-dessous vous a-t-elle aidé? – DMCS

Répondre

0

Que diriez-vous d'ajouter l'événement onscroll lors de l'événement document.onReady, au lieu de ligne sur la commande du corps? Je pense que cela devrait permettre au navigateur de faire défiler jusqu'à la position, avant que vous ayez ajouté l'événement onScroll.

Une autre option consiste à ajouter un setTimeout() pour appeler une fonction afin d'ajouter l'événement onscroll quelques centaines de millisecondes après que le document ait été entièrement rendu.

0

En bref: vous ne pouvez pas

Bien que, en faisant quelque chose comme ceci avec l'aide d'une librairie javascript tel que Prototype serait très facile en utilisant des événements personnalisés:

<script language="javascript"> 
    document.observe('user:scrolling', function() { alert('yay!'); }); 
</script> 
... 
<body onscroll="document.fire('user:scrolling')"> 
1

En examinant le résultat d'une action seulement (le document a été défilé), vous ne pouvez pas déterminer ce qui cause l'action. L'examen d'un changement d'état de certaines propriétés avant et après une action vous aidera à déterminer la cause de l'action, en supposant que ces propriétés pertinentes changent différemment selon la cause du changement.

Vous devez tenir compte des propriétés qui peuvent être pertinents à l'action de défilement d'un document, puis examiner comment ces propriétés peuvent changer:

  • à la suite d'un document puis défilent
  • lorsqu'une personne effectue le défilement
  • lorsqu'un navigateur effectue le défilement

lorsqu'une personne fait défiler un document, ils peuvent:

  • Appuyez sur une touche (flèche vers le bas, flèche haut, page vers le bas, page vers le haut, ctrl-end, ctrl-home)
  • déplacer le pointeur sur la barre de défilement, cliquez un peu, se éloigner de la barre de défilement

le modèle d'événement suivant indique une personne défilement:

  • une touche de défilement correspondante est pressée OU la souris se déplace hors de la toile du navigateur (sur la barre de défilement)
  • le document défile

Dans le cas d'un navigateur d'exécuter l'action, le document fait défiler simplement sans aucune touche correspondante précédente ou souris.

En observant ce qui se produit avant qu'un événement de défilement se produise, vous devriez être en mesure de déterminer si l'action a été initiée par une personne. Bien que cela puisse être difficile à mettre en œuvre, la logique est solide.

3

Que diriez-vous de définir un indicateur (booléen) chaque fois que vous déplacez l'écran par programmation, et de le désactiver à nouveau, lorsque le déplacement est terminé? Ensuite, votre écouteur de défilement vérifie d'abord ce drapeau, et fait ses actions sur cette base?

+0

Cela ne fonctionne pas si un événement de défilement déclenché par le navigateur existe déjà dans la file d'attente d'événements lorsque vous faites défiler la programmation. – JosiahDaniels

Questions connexes