Nie mogę uchwycić zdarzenia przewijania na iPadzie. Żadne z tych działań, co robię źle?
window.onscroll=myFunction;
document.onscroll=myFunction;
window.attachEvent("scroll",myFunction,false);
document.attachEvent("scroll",myFunction,false);
Wszystkie działają nawet w Safari 3 w systemie Windows. Jak na ironię, KAŻDA przeglądarka na PC obsługuje, window.onload=
jeśli nie masz nic przeciwko przebijaniu istniejących wydarzeń. Ale nie idź na iPada.
window.pageYOffset
a niedocument.body.scrollTop||document.documentElement.scrollTop
jak każda inna.window.pageYOffset
nie jest aktualizowany w fazie zwalniania, ale tylko po zakończeniu przewijania.W przypadku iOS musisz użyć zdarzenia touchmove , a także zdarzenia przewijania w następujący sposób:
źródło
Przepraszam za dodanie kolejnej odpowiedzi do starego postu, ale zwykle bardzo dobrze otrzymuję zdarzenie przewijania, używając tego kodu (działa przynajmniej na 6.1)
I to działa dla mnie. Jedyną rzeczą, której nie robi, jest podanie zdarzenia przewijania w celu spowolnienia przewijania (po zakończeniu zwalniania otrzymasz zdarzenie końcowego przewijania, zrób z nim tak, jak chcesz). Ale jeśli wyłączysz bezwładność z css, wykonując to
Nie dostajesz bezwładności na swoje elementy, chociaż ciało może być zmuszone do klasycznego
źródło
gesturechange
zdarzenia są niestandardowe i obsługiwane tylko przez Safari: developer.mozilla.org/en-US/docs/Web/Events/gesturechangeUdało mi się znaleźć świetne rozwiązanie tego problemu dzięki iScroll, z poczuciem przewijania pędu i wszystkiego https://github.com/cubiq/iscroll Dokument github jest świetny i głównie go śledziłem . Oto szczegóły mojej realizacji.
HTML: zawinąłem przewijalny obszar mojej zawartości w niektóre elementy div, których może używać iScroll:
CSS: Użyłem klasy Modernizr do „dotyku”, aby kierować zmiany stylu tylko na urządzenia dotykowe (ponieważ utworzyłem instancję iScroll tylko na dotyk).
JS: Dołączyłem iscroll-probe.js z pobierania iScroll, a następnie zainicjowałem scroller jak poniżej, gdzie updatePosition to moja funkcja, która reaguje na nową pozycję przewijania.
Musisz teraz użyć myScroller, aby uzyskać bieżącą pozycję, zamiast patrzeć na przesunięcie przewijania. Oto funkcja zaczerpnięta z http://markdalgleish.com/presentations/embracingtouch/ (bardzo pomocny artykuł, ale teraz trochę nieaktualny)
Jedynym innym problemem było to, że czasami traciłem część mojej strony, do której próbowałem przewijać, i odmawiała przewijania. Musiałem dodać kilka wywołań do myScroller.refresh () za każdym razem, gdy zmieniłem zawartość #wrapper, i to rozwiązało problem.
EDYCJA: Innym problemem było to, że iScroll zjada wszystkie zdarzenia „kliknięcia”. Włączyłem opcję, aby iScroll emitował zdarzenie „tap” i obsłużyłem je zamiast zdarzeń „kliknięcia”. Na szczęście nie potrzebowałem dużo klikania w obszarze przewijania, więc nie było to nic wielkiego.
źródło
Odkąd pojawił się iOS 8, ten problem już nie istnieje. Zdarzenie przewijania jest teraz uruchamiane płynnie również w iOS Safari.
Tak więc, jeśli zarejestrujesz
scroll
program obsługi zdarzeń i sprawdziszwindow.pageYOffset
w nim program obsługi zdarzeń, wszystko działa dobrze.źródło