iOS / WebKit: touchmove / touchstart no funciona en input & textarea

Tengo una aplicación web iOS que no se puede desplazar. Por esa razón, quiero desactivar el desplazamiento. Para hacer esto, uso el atributo ontouchmove de un elemento y hacer que llame a una function que utiliza element.preventDefault. Sin embargo, no puedo detectar ningún evento conmovedor cuando se inicia en un área de text o elemento de input, ¡incluso cuando el elemento está deshabilitado! También he intentado vincular el evento touchmove o touchstart a estos elementos a través de addEventlistener de JavaScript, ¡sin éxito!

Y aquí está mi JavaScript:

function onBodyLoad() { document.addEventListener( "touchstart", doNotScroll, true ); document.addEventListener( "touchmove", doNotScroll, true ); } function doNotScroll( event ) { event.preventDefault(); event.stopPropagation(); } 

¡Gracias por cualquier ayuda!

Creo que he encontrado una gran solución para este problema utilizando la propiedad CSS "puntero-events":

 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); }); 

Esto hará que Mobile Safari en iOS (otros no probados hasta ahora) ignoren las áreas de text para desplazarse, pero permite establecer el foco, etc., como siempre.

¡La respuesta de Thomas Bachem es la única!

Lo reescribí en jQuery. Simplemente agregue una class scrollFix a sus inputs deseadas y ya está listo para ir. O adjunte los manejadores de events a todas las inputs y áreas de text usando $('input, textarea') .

Ahora cuando tocas y navegas en una input en iOS 8+, la input obtiene todos sus pointer-events deshabilitados (incluido el comportamiento problemático). Esos pointer-events están habilitados cuando detectamos un toque simple.

 $('.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); });