javascript scroll event dla iPhone/iPad?
Nie mogę uchwycić zdarzenia przewijania na iPadzie. Nic z tych rzeczy nie 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 na Safari 3 Na Windows.
Jak na ironię, każda przeglądarka na komputerze obsługuje window.onload=
, jeśli nie masz nic przeciwko blokowaniu istniejących zdarzeń. Ale nie na iPadzie.
5 answers
IPhoneOS rejestruje onscroll
zdarzenia, z wyjątkiem nie tego, czego można się spodziewać.
Panoramowanie jednym palcem nie generuje żadnych zdarzeń, dopóki użytkownik nie przestanie panoramować-Zdarzenie
onscroll
jest generowane, gdy strona przestaje się poruszać i ponownie rysuje-jak pokazano na rysunku 6-1.
Podobnie, przewijanie dwoma palcami uruchamia się onscroll
dopiero po zaprzestaniu przewijania.
Zwykły sposób instalacji obsługi działa np.
window.addEventListener('scroll', function() { alert("Scrolled"); });
// or
$(window).scroll(function() { alert("Scrolled"); });
// or
window.onscroll = function() { alert("Scrolled"); };
// etc
(Patrz również https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 17:07:23
Dla systemu iOS należy użyć zdarzenia touchmove oraz zdarzenia scroll w następujący sposób:
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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-20 07:15:42
Przepraszam za dodanie kolejnej odpowiedzi do starego posta, ale zwykle bardzo dobrze dostaję Zdarzenie scroll używając tego kodu (działa co najmniej na 6.1)
element.addEventListener('scroll', function() {
console.log(this.scrollTop);
});
// This is the magic, this gives me "live" scroll events
element.addEventListener('gesturechange', function() {});
I to mi pasuje. Jedyną rzeczą, której nie robi, jest podanie zdarzenia przewijania dla opóźnienia przewijania (po zakończeniu opóźnienia otrzymasz ostateczne Zdarzenie przewijania, rób z nim tak, jak chcesz.) ale jeśli wyłączysz bezwładność za pomocą css robiąc to
-webkit-overflow-scrolling: none;
Nie masz bezwładności na swoich elementach, bo ciało może have to do the classic
document.addEventListener('touchmove', function(e) {e.preventDefault();}, true);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-19 15:32:29
Udało mi się uzyskać świetne rozwiązanie tego problemu z iscrollem, z poczuciem przewijania pędu i wszystkim https://github.com/cubiq/iscroll github doc jest świetny, i głównie go śledziłem. Oto szczegóły mojej realizacji.
HTML: I owinął przewijalny obszar mojej zawartości w niektórych divów, które iScroll może użyć:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS: Używałem klasy Modernizr dla "touch", aby kierować moje zmiany stylu tylko do urządzeń dotykowych (bo I tylko instanted iScroll na dotyku).
.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: Włączyłem iscroll-probe.js z iscroll Pobierz, a następnie zainicjował scroller jak poniżej, gdzie updatePosition jest moją funkcją, która reaguje na nową pozycję przewijania.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Musisz 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ę nieaktualne)
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};
}
Jedyną inną gotcha było to, że czasami traciłem część mojej strony, którą próbowałem przewijać, a ona odmawiała przewijania. Musiałem dodać kilka połączeń do myScroller.refresh() za każdym razem, gdy zmieniałem zawartość # wrappera i to rozwiązywało problem.
EDIT: Kolejną zaletą było to, że iScroll zjada wszystkie zdarzenia "klikania". Włączyłem opcję, aby iScroll emitował Zdarzenie " tap "i obsługiwał je zamiast zdarzeń "click". Na Szczęście Ja nie trzeba było dużo klikania w obszarze przewijania, więc nie było to nic wielkiego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-18 22:37:59
Odkąd pojawił się iOS 8, ten problem już nie istnieje. Zdarzenie przewijania jest teraz uruchamiane płynnie również w przeglądarce iOS Safari.
Więc, jeśli zarejestrujesz scroll
obsługę zdarzeń i sprawdzisz window.pageYOffset
wewnątrz tej obsługi zdarzeń, wszystko działa dobrze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 11:52:40