2011-03-18 16 views
14

Contexto: aplicación Web en MobileSafari/iPad, tanto en pantalla completa y se incluyeron en iframePrevenir por defecto Presione, pero no por defecto Arrastre en iOS MobileSafari?

Meta: Técnica que proporciona controladores de eventos personalizados para Prensa y Tap pero noPinch (zoom) o Arrastra (scroll/pan). Queremos proporcionar un comportamiento personalizado para Press, pero dejar que Safari maneje Scroll/Pan/Zoom todavía.

Problema: Los dos objetivos parecen ser mutuamente excluyentes. Para evitar el comportamiento predeterminado de un gesto de prensa, debe llamarse al event.preventDefault en respuesta inmediata al ontouchstart. Sin embargo, para permitir que el comportamiento predeterminado proceda con Arrastrar, debemos no llamar a event.preventDefault en el inicio de inicio inicial. Una vez que se invoca preventDefault, no hay forma de recuperar el comportamiento predeterminado durante esa secuencia de gestos (es decir, hasta que todos los dedos se salgan). Arrastre no se reconoce hasta que haya ocurrido algún movimiento.

Arrastrar se ilustra como el ejemplo más simple, pero nos preocupamos por obtener el comportamiento predeterminado para Pellizcar y Doble toque también. Nunca queremos que el comportamiento predeterminado de MobileSafari Press sea "Copiar imagen" o seleccionar texto.

intentos hasta el momento:

  • guardar el evento ontouchstart y, después de un timeout, llame a preventDefault en él más tarde (justo antes de la prensa sería reconocido). Sin efecto.
  • Escuche 'oncontextmenu'. No, el comportamiento de la prensa predeterminado no se señala ni se enruta a través de este evento.
  • Evite el valor predeterminado en todos nuestros controladores ontouch *, y cuando reconozcamos un gesto Arrastrar/Pellizcar, simulemos nuevos eventos usando initTouchEvent y/o initGestureEvent. Los eventos creados mediante programación golpean todas las devoluciones de llamada , pero Safari parece no prestarles atención, lo que no desencadena ningún comportamiento predeterminado.
  • Divida el reconocimiento de Safari's Press con un movimiento falso. Safari cancela una presión en el más mínimo movimiento, pero permitimos un poco de slop. Simular un evento de movimiento (como el anterior) justo después de que ontouchstart no haga que Safari no reconozca Presione si el dedo no se mueve "de verdad".

Tenemos un conjunto completo de reconocedores de gestos implementados (en Javascript, ontouch *) al estilo de native iOS gesture recognizers de Apple. No tenemos problemas para reconocer cualquier gesto, simplemente no sabemos de una buena manera de replicar el comportamiento Zoom/Panorámica/Doble toque que Safari proporciona de forma gratuita.

No necesitamos código; estamos buscando cualquier solución teórica (más allá de "solo implementar pan/zoom usted mismo", aunque si tiene una forma hábil de hacerlo nos interesa) que conduzca a un éxito razonable. También estamos interesados ​​en conocer otros intentos similares para hacer esto: seguramente no podemos haber sido los primeros en probar este?

Alternate TL; DR: ¿Hay alguna manera de evitar un valor predeterminado Presione (también conocido como tocar y mantener) que no sea en el inicio táctil?

Respuesta

19

Éxito: Impedir el comportamiento de "impresión predeterminada" por completo a través de CSS en lugar de prevenirDefault. Esta respuesta fue proporcionado por Safari Tecnologías Evangelista Vicki Murley sobre here (es necesario registrarse)

que veo en tu post StackOverflow que usted que su objetivo final es que:

"no queremos que el valor por defecto MobileSafari Press comportamiento de "Copiar Imagen" o seleccionar texto. "

Estos comportamientos se puede desactivar en CSS (+ propiedad de un bono, ya que las personas a menudo quieren para apagar el punto culminante si están apagando estos otros comportamientos ):

/* behavior */ 
-webkit-user-select: none;    /* disable cut copy paste */ 
-webkit-touch-callout: none;    /* disable callout, image save panel */ 
-webkit-tap-highlight-color: transparent; /* "turn off" link highlight */ 

Comentario: Supusimos que el comportamiento de Safari's Press se basaba en eventos, no en CSS. Llamar preventDefault ontouchstart cancela el comportamiento de la prensa (que es lo que nos desvió, en realidad), pero parece ser un efecto secundario no deseado. Realmente, Mobile Safari no ejecuta un "evento de prensa" tanto como "CSS en prensa".

Desactivar el comportamiento de la prensa con CSS nos ha permitido una vez más llamar a preventDefault solo donde y cuando realmente lo necesitamos.

0

Ugly Possibility: No evite una prensa - realice una pulsación predeterminada y no haga nada. Intenta usar un div de panel de cristal que capte todos los toques y no impida nada al tocar.

Las divisiones tienen un comportamiento predeterminado de la prensa (algún tipo de selección), pero quizás eso se puede desactivar, no a través de preventDevault sino a través de <body style="-webkit-user-select:none">? ref

Esto significa que tendríamos que hacer nuestras propias pruebas de detección para determinar a qué nodos DOM pasar nuestros eventos reconocidos, ya que no podemos permitir que los eventos salten a la cadena de antecesores de DOM.