Mam problemy z połączeniem transformacji CSS i testowaniem trafienia zdarzenia dotykowego. Powtarza się to tylko w Chrome na Androida 4 (stabilne i beta). Safari na iOS, a także pulpit Chrome z emulacją dotykową, wydają się działać poprawnie.Android 4 Problem z testowaniem trafień dotykowych Chrome na zdarzenia dotykowe po transformacji CSS
Jestem prawie pewien, że to musi być błąd, więc myślę, że głównie szukam obejść tutaj.
Kwestia polega na tym, że testowanie trafień tylko dotykowych wydaje się działać w przypadku, gdy element był przed transformacją, a nie w pozycji końcowej. Możesz zobaczyć przykład na moim jsfiddle (tylko na Androida 4 Chrome):
jsfiddle: http://jsfiddle.net/LfaQq/ pełny ekran: http://jsfiddle.net/LfaQq/embedded/result/
Jeśli przeciągnij niebieskie pole w połowie drogi w dół ekranu i puść to przystawki z powrotem do szczyt. Teraz, jeśli spróbujesz ponownie przeciągnąć z górnej połowy strony, żaden dotyk się nie zarejestruje. Zdarzenia dotykowe nie są nawet wystrzeliwane z elementu. Jeśli jednak spróbujesz dotknąć dna elementu, działa dobrze. Możesz spróbować przenieść go od dołu i obserwując, że testowanie trafień nie działa już na dole, ale działa na górze.
To jak ja obsługi zdarzeń:
function handleTouch(e) {
console.log("handle touch")
e.preventDefault();
switch(e.type){
case 'touchstart':
console.log("touchstart");
touchOriginY = e.targetTouches[0].screenY;
break;
case 'touchmove':
console.log("touchmove");
el.innerHTML = e.targetTouches[0].screenY;
var p = e.targetTouches[0].screenY - touchOriginY;
el.style[TRANSFORM] = 'translate3d(0,' + p + 'px' + ',0)';
break;
case 'touchcancel':
console.log("touchcancel");
// Fall through to touchend
case 'touchend':
//console.log("touchend");
//el.style[TRANSITION] = '.4s ease-out';
el.style[TRANSFORM] = 'translate3d(0,0,0)';
break;
}
}
el.addEventListener('touchstart', handleTouch);
el.addEventListener('touchend', handleTouch);
el.addEventListener('touchmove', handleTouch);
el.addEventListener(TRANSITION_END, function(e) {
console.log("transition end")
el.style[TRANSITION] = '';
});
nie mam żadnych problemów z przekształceń w touchmove, jak te nie są nowe akcenty, które mają być wykrywane i tak.
Wszelkie sugestie?
Myślę, że trochę się odblokowałem na ten temat na razie. Usunięcie aktualizacji innerHTML z touchmove zatrzymuje trafiony cel. Mam nadzieję, że to nie powróci, by mnie ugryźć, gdy prawnie potrzebuję zaktualizować zawartość wewnątrz elementu później. –