JavaScript événement de défilement pour iPhone / iPad?

je n'arrive pas à capturer l'événement scroll sur un iPad. Aucun de ces travaux, ce que je fais mal?

window.onscroll=myFunction;

document.onscroll=myFunction;

window.attachEvent("scroll",myFunction,false);

document.attachEvent("scroll",myFunction,false);

ils travaillent tous même sur Safari 3 sous Windows. Ironiquement, chaque navigateur sur le PC prend en charge window.onload= si vous ne vous gênez pas pour saboter les événements existants. Mais pas d'aller sur iPad.

98
demandé sur ck_ 2010-05-19 11:18:28

5 réponses

L'iPhoneOS ne capture onscroll événements", mais pas tout à fait la façon dont vous pouvez vous attendre.

Le

ne génère aucun événement tant que l'utilisateur n'a pas arrêté le onscroll -un événement onscroll est généré lorsque la page cesse de bouger et se redessine-comme le montre la Figure 6-1.

de même, faites défiler avec 2 doigts le feu onscroll seulement après que vous avez arrêté défiler.

la façon habituelle d'installer le manipulateur fonctionne par exemple

window.addEventListener('scroll', function() { alert("Scrolled"); });
// or
$(window).scroll(function() { alert("Scrolled"); });
// or
window.onscroll = function() { alert("Scrolled"); };
// etc 

(Voir aussi ) https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html )

136
répondu kennytm 2017-06-30 17:07:23

pour iOS vous devez utiliser l'événement touchmove ainsi que le scroll événement comme ceci:

document.addEventListener("touchmove", ScrollStart, false);
document.addEventListener("scroll", Scroll, false);

function ScrollStart() {
    //start of scroll event for iOS
}

function Scroll() {
    //end of scroll event for iOS
    //and
    //start/end of scroll event for other browsers
}
94
répondu George Filippakos 2013-04-20 07:15:42

Désolé d'ajouter une autre réponse à un vieux post mais je reçois habituellement un événement de défilement très bien en utilisant ce code (il fonctionne au moins sur 6.1)

element.addEventListener('scroll', function() {
    console.log(this.scrollTop);
});

// This is the magic, this gives me "live" scroll events
element.addEventListener('gesturechange', function() {});

et ça marche 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 est terminée, vous obtenez un événement de défilement final, faire comme vous le voulez avec elle.), mais si vous désactivez l'inertie avec css en faisant cela,

-webkit-overflow-scrolling: none;

Vous n'obtiendrez pas inertie sur vos éléments, pour le corps bien que vous pourriez avoir à faire le classique

document.addEventListener('touchmove', function(e) {e.preventDefault();}, true);
36
répondu Dave Mackintosh 2013-06-19 15:32:29

j'ai pu obtenir une grande solution à ce problème avec iScroll, avec la sensation de défilement de l'impulsion et tout https://github.com/cubiq/iscroll the github doc is great, and I most followed it. Voici les détails de ma mise en œuvre.

HTML: J'ai enveloppé la zone scrollable de mon contenu dans quelques divs que iScroll peut utiliser:

<div id="wrapper">
  <div id="scroller">
    ... my scrollable content
  </div>
</div>

CSS: Je j'ai utilisé la classe Modernizr pour "touch" pour cibler mes modifications de style uniquement sur les appareils tactiles (parce que je n'ai instancié iScroll que sur touch).

.touch #wrapper {
  position: absolute;
  z-index: 1;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  overflow: hidden;
}
.touch #scroller {
  position: absolute;
  z-index: 1;
  width: 100%;
}

JS: J'ai inclus iscroll-sonde.js du téléchargement d'iScroll, puis initialisé le scroller comme ci-dessous, où updatePosition est ma fonction qui réagit à la nouvelle position de scroll.

# coffeescript
if Modernizr.touch
  myScroller = new IScroll('#wrapper', probeType: 3)
  myScroller.on 'scroll', updatePosition
  myScroller.on 'scrollEnd', updatePosition

Vous devez utiliser myScroller pour obtenir la position actuelle maintenant, au lieu de en regardant l'offset du rouleau. Voici une fonction prises de http://markdalgleish.com/presentations/embracingtouch/ (un super article utile, mais un peu démodé maintenant)

function getScroll(elem, iscroll) {   
  var x, y;

  if (Modernizr.touch && iscroll) {
    x = iscroll.x * -1;
    y = iscroll.y * -1;   
  } else {
    x = elem.scrollTop;
    y = elem.scrollLeft;   
  }

  return {x: x, y: y}; 
}

le seul autre gotcha était de temps en temps je perdais une partie de ma page que j'essayais de faire défiler, et elle refusait de défiler. J'ai dû ajouter des appels à myScroller.refresh() chaque fois que j'ai changé le contenu du # wrapper, et cela a résolu le problème problème.

EDIT: un autre gotcha était que iScroll mange tous les événements "click". J'ai activé l'option pour que iScroll émette un événement "tap" et les gère au lieu des événements "click". Heureusement je n'ai pas besoin de beaucoup d'cliquant dans la zone de défilement, ce n'était pas une grosse affaire.

6
répondu Melinda Weathers 2014-04-18 22:37:59

Depuis iOS 8 est sorti, ce problème n'existe plus. L'événement scroll est maintenant lancé en douceur dans iOS Safari aussi bien.

donc, si vous enregistrez le scroll event handler et cochez window.pageYOffset à l'intérieur de ce event handler, tout fonctionne très bien.

0
répondu Matthias Bohlen 2018-08-24 11:52:40