Je n'arrive pas à capturer l'événement de défilement sur un iPad. Aucun de ces travaux, qu'est-ce que je fais mal?
window.onscroll=myFunction;
document.onscroll=myFunction;
window.attachEvent("scroll",myFunction,false);
document.attachEvent("scroll",myFunction,false);
Ils fonctionnent tous même sur Safari 3 sous Windows. Ironiquement, CHAQUE navigateur sur le PC prend en charge window.onload=
si cela ne vous dérange pas de clobber les événements existants. Mais pas sur iPad.
window.pageYOffset
et pasdocument.body.scrollTop||document.documentElement.scrollTop
comme tous les autres navigateurs / matériels existants.window.pageYOffset
n'est pas mis à jour dans la phase de décélération, mais uniquement lorsque le défilement se termine.Pour iOS, vous devez utiliser l' événement touchmove ainsi que l' événement scroll comme ceci:
la source
Désolé d'avoir ajouté une autre réponse à un ancien article mais j'obtiens généralement très bien un événement de défilement en utilisant ce code (cela fonctionne au moins sur 6.1)
Et cela fonctionne pour moi. La seule chose qu'il ne fait pas est de donner un événement de défilement pour la décélération du défilement (une fois la décélération terminée, vous obtenez un événement de défilement final, faites comme vous le ferez avec.) Mais si vous désactivez l'inertie avec css en faisant ceci
Vous n'obtenez pas d'inertie sur vos éléments, pour le corps même si vous devrez peut-être faire le classique
la source
gesturechange
les événements ne sont pas standard et sont uniquement pris en charge par Safari: developer.mozilla.org/en-US/docs/Web/Events/gesturechangeJ'ai pu trouver une excellente solution à ce problème avec iScroll, avec la sensation de défilement dynamique et tout https://github.com/cubiq/iscroll La doc github est excellente, et je l'ai principalement suivie. Voici les détails de ma mise en œuvre.
HTML: J'ai enveloppé la zone de défilement de mon contenu dans quelques div qu'iScroll peut utiliser:
CSS: J'ai utilisé la classe Modernizr pour "touch" pour cibler mes changements de style uniquement sur les appareils tactiles (car je n'ai instancié iScroll qu'au toucher).
JS: J'ai inclus iscroll-probe.js du téléchargement iScroll, puis j'ai initialisé le défilement comme ci-dessous, où updatePosition est ma fonction qui réagit à la nouvelle position de défilement.
Vous devez utiliser myScroller pour obtenir la position actuelle maintenant, au lieu de regarder le décalage de défilement. Voici une fonction tirée de http://markdalgleish.com/presentations/embracingtouch/ (un article super utile, mais un peu dépassé maintenant)
Le seul autre problème était que je perdais parfois une partie de ma page sur laquelle j'essayais de faire défiler, et elle refusait de défiler. J'ai dû ajouter quelques appels à myScroller.refresh () chaque fois que je changeais le contenu du #wrapper, et cela résolvait le problème.
EDIT: Un autre problème était que iScroll mange tous les événements de "clic". J'ai activé l'option pour qu'iScroll émette un événement «tap» et ai géré ceux-ci au lieu des événements «clic». Heureusement, je n'ai pas eu besoin de beaucoup de clics dans la zone de défilement, donc ce n'était pas un gros problème.
la source
Depuis la sortie d'iOS 8, ce problème n'existe plus. L'événement de défilement est désormais déclenché en douceur dans iOS Safari également.
Donc, si vous enregistrez le
scroll
gestionnaire d'événements et vérifiez à l'window.pageYOffset
intérieur de ce gestionnaire d'événements, tout fonctionne très bien.la source