2010-11-14 33 views
8

Mam aplikację internetową IOS, której nie można przewinąć. Z tego powodu chcę dezaktywować przewijanie. Aby to zrobić, używam atrybutu ontouchmove elementu i wywołuję funkcję używającą elementu.preventDefault. Jednak nie jestem w stanie wykryć żadnego zdarzenia dotykowego, gdy rozpoczyna się ono na polu tekstowym lub elemencie wejściowym, nawet jeśli element jest wyłączony! Próbowałem również powiązać zdarzenie touchmove lub touchstart z tymi elementami za pomocą addEventlistener JavaScriptu, bez powodzenia!iOS/WebKit: touchmove/touchstart nie działa na wejściu i textarea

A oto moja JavaScript:

function onBodyLoad() { 

document.addEventListener("touchstart", doNotScroll, true); 
document.addEventListener("touchmove", doNotScroll, true); 

} 

function doNotScroll(event) { 

event.preventDefault(); 
event.stopPropagation(); 

} 

Dzięki za wszelką pomoc!

+0

wymyśliłem częściowe rozwiązanie: http://mobweb.ch/2010-12-06-iosphonegap-prevent-scrolling-when-gesture-starts-on-input-element - Nadal szukasz czegoś lepiej! –

Odpowiedz

10

myślę Znalazłem wielki obejście tego problemu za pomocą wskaźnika „Zdarzenia” własności CSS:

function setTextareaPointerEvents(value) { 
    var nodes = document.getElementsByTagName('textarea'); 
    for(var i = 0; i < nodes.length; i++) { 
     nodes[i].style.pointerEvents = value; 
    } 
} 

document.addEventListener('DOMContentLoaded', function() { 
    setTextareaPointerEvents('none'); 
}); 

document.addEventListener('touchstart', function() { 
    setTextareaPointerEvents('auto'); 
}); 

document.addEventListener('touchmove', function(e) { 
    e.preventDefault(); 
    setTextareaPointerEvents('none'); 
}); 

document.addEventListener('touchend', function() { 
    setTimeout(function() { 
     setTextareaPointerEvents('none'); 
    }, 0); 
}); 

uczyni Mobile Safari na iOS (inni nie testowano dotychczas) ignorować pola tekstowe do przewijania, ale pozwala ustawić ostrość jak zwykle.

+0

Mój bohater! Działa w Safari i Chrome na iPada. – nothingisnecessary

+0

Czy to nadal jest prawidłowe rozwiązanie? Użyłem implementacji jQuery firmy Dotgreg i gdy pozwala ona przewijać, nie można ustawić ostrości na wejściach. Pamiętaj, że dany formularz jest w lightboxie V2 w Fancybox, tylko po to, aby dodać mu cierpienia. Przetestowano to na 6 Plus z systemem iOS 10 i w przeglądarce BrowserStack na 7 z iOS10. – Bobe

2

the Thomas Bachem answer jest jednym!

Przepisałem go w jQuery. Wystarczy dodać klasę scrollFix do żądanych wejść i jesteś gotowy do pracy. Lub załączyć procedury obsługi zdarzeń do wszystkich danych wejściowych i tekstowych za pomocą $('input, textarea').

Teraz po dotknięciu i przewinięciu wejścia w systemie iOS 8+ dane wejściowe zostają wyłączone (pointer-events) (w tym problematyczne zachowanie). Te pointer-events są włączone, gdy wykryjemy prosty dotyk.

$('.scrollFix').css("pointer-events","none"); 

$('body').on('touchstart', function(e) { 
    $('.scrollFix').css("pointer-events","auto"); 
}); 
$('body').on('touchmove', function(e) { 
    $('.scrollFix').css("pointer-events","none"); 
}); 
$('body').on('touchend', function(e) { 
    setTimeout(function() { 
     $('.scrollFix').css("pointer-events", "none"); 
    },0); 
}); 
Powiązane problemy