2011-10-13 4 views
5

que tienen una aplicación basada en web que incluye un componente que el usuario puede desplazarse hacia arriba y hacia abajo con su dedo. Utilizo el método preventDefault del evento para evitar el comportamiento predeterminado donde el movimiento táctil desplaza toda la pantalla en dispositivos iOS.¿Cómo evito el comportamiento predeterminado del evento touchmove en iOS 5?

Desafortunadamente, esto no parece que trabajar más en IOS 5, que Acabo de actualizar a esta mañana. Tengo que suponer que esto se hace de forma diferente en iOS 5, pero aún no he podido encontrar un recurso que proporcione instrucciones.

Gracias!

Actualización n. ° 1: No he podido encontrar una respuesta a mi pregunta específica, pero pude ajustar un poco mi código para usar el estilo -webkit-overflow-scrolling (establecido en un valor de "táctil" ") e implemente la capacidad de desplazamiento inercial snazzy (donde el contenido se desplaza más rápido según la velocidad de deslizamiento y" rebote de banda elástica "si llega a los límites. Muy bien parecido ...

Actualización n. ° 2: Tengo otro problema extraño ahora. Por alguna extraña razón, el comportamiento de desplazamiento por desbordamiento se mezcla a veces por lo cual tienes que arrastrar el dedo hacia la izquierda y la derecha en el elemento que lo contiene para hacer que su contenido se mueva hacia arriba o hacia abajo. para descubrir por qué sucede esto, ¿alguien tiene alguna idea?

Respuesta

6

En primer lugar, se puede verificar que e.preventDefault() desactiva todas desplazamiento en IOS 5 usando el siguiente código:

document.ontouchmove = function(e){ e.preventDefault(); } 

Desafortunadamente, sin embargo, esto desactiva el desplazamiento en caso de desbordamiento: desplazarse divs. (Si alguien tiene una solución que deja habilitado el desplazamiento del elemento interno, compártala.)

Respecto a la actualización n. ° 2, he notado un comportamiento extraño cuando hay un elemento desplazable anidado en otro elemento desplazable (incluida la página). En ocasiones, el dispositivo duda sobre qué elemento desea desplazarse el usuario. En particular, he notado este problema al usar la posición: fijo. Mi solución fue asegurarme de que el cuerpo tenga un 100% de altura y que los elementos desplazables usen la posición: absoluta cuando sea posible.

+0

Tal vez podría hacer algo de lógica comprobar como 'if ($ (e.currentTarget) css ('desbordamiento') = 'scroll'!) e .preventDefault(); '. Desde document.ontouchmove se disparará después onTouchMove del elemento scollable, se puede hacer 'el.ontouchmove = function() {allowScroll = true}' 'y luego tienen document.ontouchmove' utilizar este valor para determinar la acción a continuación, establezca el valor de nuevo a falso –

+0

@BrianNickel Gracias por la sugerencia. Este es un paso en la dirección correcta que le permitirá evitar el desplazamiento directo sobre una base de elemento por elemento (incluyendo el desplazamiento directamente en el cuerpo), pero si el usuario touchmoves un elemento desplazable que ya está en el borde de su desplazable rango, todavía terminará desplazándose por el cuerpo (mostrando la ropa interior gris debajo). ¿Quizás la única forma es interpretar la dirección de la sacudida y verificar si el elemento está en el borde de su rango desplazable? –

+0

@RyanRapp Gracias por su respuesta.Tal vez no describí con suficiente claridad de qué comportamiento estoy hablando. Con iOS 4 usaría e.preventDefault() dentro de un elemento (digamos, un DIV) con el manejador de eventos touchmove de overflow, de manera que pudiera cambiar el contenido a través de un posicionamiento absoluto basado en el movimiento del dedo dentro del elemento. Ahora que e.preventDefault() bloquea esto cuando intento mover el dedo por toda la página, que no tiene suficiente contenido para desplazarse, no se desplaza tanto, sino que se mueve para que pueda ver la textura de fondo de Safari. – natlee75

7

he encontrado una solución muy simple. Cuando el evento golpea tu elemento que tiene permiso para desplazarse, simplemente agrega bandera en el evento. En el detector de eventos en el documento que acaba de comprobar si se establece el indicador y sólo detener el evento si la bandera no está definida:

this.$scrollableEl.on('touchmove', function(event){ 
    event.comesFromScrollable = true; 
    //when you have containers that are srollable but 
    //doesn't have enough content to scroll sometimes: 
    //event.comesFromScrollable = el.offsetHeight < el.scrollHeight; 
}) 

$document.on('touchmove', function(event){ 
    if(!event.comesFromScrollable){ 
     event.preventDefault() 
    } 
    }) 

También es posible usar event.stopImmediatePropagation lugar, por lo que no necesita la eventListener en el documento elemento, pero esto rompe Zepto.js tap en mi caso:

this.$scrollableEl.on('touchmove', function(event){ 
    event.stopImmediatePropagation() 
}) 
+0

Gracias! ¡Funciona de maravilla! Lo modifiqué de la misma manera que simplemente agregué un atributo de datos personalizado y si ese desplazamiento disponible no se detendrá. de esta manera podemos salvar a un eventlistener :) –

Cuestiones relacionadas