2011-01-12 13 views
19

Estoy a punto de desarrollar una importante aplicación móvil WebKit con capacidad táctil.Gotchas/errores en desarrollo para WebKit en iOS o Android

Estoy buscando sugerencias o consejos sobre cosas que difieren de un navegador basado en escritorio estándar (s).

Por ejemplo:

  • en IOS click eventos no se propagan hacia arriba para el elemento body sobre los elementos, a excepción de algunos casos (links, entradas, elementos con eventos adjuntos, etc.).

  • Android WebKit no emite eventos para multi-touch.

Sé esto. ¿Hay algún otro problema? ¿Conoces alguna lista de problemas conocidos?

Respuesta

6

no sé de una lista compilada, pero puedo enumerar algunas:

  • SVG no está soportado (actualmente) en Android, como ha sido desactivado. El soporte viene en Honeycomb. Por el contrario, iOS ha dejado habilitada la compatibilidad SVG y parece funcionar muy bien.
  • Si bien ambos navegadores son compatibles con la opacidad CSS 3, asegúrese de probar a fondo las animaciones ya que pueden ser bastante agitado para los gráficos más complejos (especialmente con múltiples capas de opacidad.)
  • En mi javascript, normalmente escucho el "touchstart "," touchmove ", o" touchend "eventos por el bien de la velocidad (el evento" hacer clic "normalmente provoca un retraso notable) y la granularidad.
  • Las funciones HTML5 como localStorage y las nuevas etiquetas de audio y video parecen funcionar bien. Sin embargo, en el iPhone no puede reproducir automáticamente audio o video, ya que el evento de reproducción (y la descarga correspondiente) debe ser activado directamente por el usuario.
  • Las transiciones que implican movimiento (cambiando las coordenadas xey) son bastante suaves. Por el contrario, las transiciones que implican la opacidad puede ser bastante agitado en función de los recursos involucrados (a veces puede que tenga que utilizar un sprite para conseguir una sensación más suave.)

Sólo algunas observaciones rápidas.

+1

+1 para obtener información sobre el desfase entre el tacto de arranque/mover/final y haga clic. Gracias Adam! – Petrogad

+0

He descubierto que tengo que e.preventDefault() en todos mis eventos táctiles para evitar que los clics también se activen. – eighteyes

0

position: fixed no funciona.

The mobile section of QuirksMode probablemente sea muy útil.

+0

Ahora es compatible con 4.0.3. – alex

+0

Sin embargo, es bastante complicado cuando se combina con el teclado emergente en iOS particularmente –

0

Bueno, hay un error molesto en Android donde configurar el símbolo o la selección con Javascript no tiene ningún efecto real sobre dónde ocurre la entrada.
me hizo una pregunta sobre el tema y la conclusión fue que era un error del navegador :(, que ocurre en 2.2 y 2.3.

Focus textarea with caret after text in Android browser

10

he encontrado algunas cosas en mis últimos esfuerzos con . iPAD

1: la versión 4.2 de iOS tiene un error en la ejecución de demasiados documento.getElementById ('foo'); hará que el navegador se demore y, por lo tanto, no ejecute los comandos correctamente. Para remediar esto, necesita crear variables para contener esta información y solo hacer los comandos de selección cuando sea necesario. Sin embargo, la versión 4.3 del iOS soluciona esto, ya que lo probé en mi iPad.

2: Cuando se trabaja con el posicionamiento, he encontrado que cuando la creación de su propio controlador de vídeo (para HTML5), si intenta cambiar el tamaño del contenedor de vídeo mediante el uso de position: relative o position: absolute, ya no lo hará ver un video, pero una bonita pantalla negra (¡con sonido!). Para remediar esto, simplemente apunte al marco principal y listo.

3: Si está utilizando iScroll, asegúrese de poner un tiempo de espera para que se cargue; especialmente si usted tiene algunas otras javascript en la página como a pesar de que el documento tiene que cargar cuando 'se carga la página' a través de:

// Load iScroll when DOM content is ready. 
document.addEventListener('DOMContentLoaded', loaded, false); 

he tenido esta falla, y no podía imaginar para el vida de mí por qué mi div no estaba dimensionando correctamente mostrándome todos los elementos pero los dos últimos y no desplazándome. En su lugar, simplemente hice un

$(function(){ 
    //other page loaded items to do 
    //the iScroller init 
    setTimeout('iScrollerInit();',200); 
}); 

y solucionó el problema muy rápidamente.

4: Si ve que sus clics no funcionan del todo bien, he descubierto que muchos de los SDK móviles que hay vinculan todo, haciendo que sea difícil conseguir clics para las cosas que normalmente desea. Así que para solucionar este problema, puede hacer algo como:

$("#yourId").unbind("click").click(function(){ 
    //what to do when clicked 
}); 

y he encontrado que esto funcione más brillante.

**UPDATE - Nov 2012 **: It's been a few years, and there is so much more to add to this so wanted to update the list a bit.

5: Javascript es caro en un puñado de dispositivos Still (diciembre de 2012). Hacer cosas que manipulan el DOM genera una gran cantidad de retraso en los dispositivos y debe tener mucho cuidado al hacer estas cosas. Deberá asegurarse de probar sus páginas web móviles tanto en dispositivos anteriores de Android como en dispositivos más antiguos de iPhone, ya que según nuestras métricas estos siguen siendo dispositivos bien utilizados.

6: Si estás pasando HTML para cargar en una vista-web en un dispositivo (iPhone App o Android) hay momentos en los que se ven casi una altura 0. Lo que hay que hacer es tener su La aplicación iPhone o Android realiza una llamada de Javascript en la página real dirigida a un div para verificar la altura de desplazamiento de la página, lo que permitirá que la altura de la vista web se establezca con precisión.

**UPDATE - Dec 2012 **: Few more awesome findings

7: He descubierto que cuando el destino de su divs para eventos de clic que los navegadores móviles esperarán 300 ms antes de disparar el evento, creando efectivamente un retraso. Lo hacen para confirmar que el clic no fue un doble toque. para evitar esto, puedes vincular eventos touchend en su lugar, ¡que se dispararán al instante!

Aquí hay un poco de código

$(document).ready(function() { 
    $('#element').bind('touchstart', function(event) { 
     event.stopPropagation(); 
     event.preventDefault(); 
     $(this).toggleClass('hover_heading'); 
    }); 

    $('#element').bind('touchend', function(event) { 
     event.preventDefault(); 
     $(this).toggleClass('hover_heading'); 
    }); 
}); 

A continuación, una vez que vea parpadear pasando por encima de sus artículos utilizan esto para eliminar eso.

body * { 
    -webkit-tap-highlight-color: rgba(0,0,0,0); 
} 

Además, si desea retirar un artículo excepcional Google escribió en este se puede ver aquí: - Creating Fast Buttons for Mobile Web Applications

**UPDATE - Feb 2013 **: Few more awesome findings

: Cuando versionar sus archivos CSS y el almacenamiento en caché con URL como: midominio.com/css/styles.css?v=123 (u otra cosa), tenga cuidado con los dispositivos con Android 2.2 y antes, ya que esto genera un comportamiento extremadamente extraño.

De mis hallazgos, android lo renderizará completamente mal, y forzará al html incluso a ser arruinado. La mejor manera de trabajar con estos dispositivos más antiguos es, lamentablemente, cambiar el nombre real del archivo.

Esperamos que estos hallazgos ayudan a los demás como he luchado a través de cada uno de estos problemas a múltiples horas rascándome la cabeza :)

+2

es divertido cuando respondes una pregunta; solo para volver un año después y descubrir que el mismo artículo con el que luchabas (n. ° 3) ya encontraste una solución para ... gritos: x – Petrogad

0

dos "características" Me he encontrado:

  1. cajas de entrada no responda a eventos táctiles (ontouchstart, ontouchmove, ontouchcancel), lo que también significa que ontouchmove = "event.preventDefault()" no evitará el desplazamiento de página si está creando una aplicación de página fija y no desplazable. (Es posible crear una solución klunky utilizando divs ocultos).

  2. Es imposible usar el enfoque automático o element.focus() en cualquier campo de formulario en WebKit, ya sea en Android o iOS. El elemento recibirá un cursor, pero el teclado no aparecerá. Todavía estoy tratando de construir una solución para esto, pero por el momento es una limitación conocida e intencional. :(

1

3D. webkit en Android se rompe, especialmente cuando se trata de todo lo relacionado con los campos de entrada.

http://code.google.com/p/android/issues/detail?id=13048

Ha habido algunas ocasiones en las que he intentado rastrear el comportamiento de CSS aleatorio y, finalmente, se reduce a -webkit-transform:translate3d(0,0,0); en un elemento superior (para habilitar la aceleración de hardware en dispositivos iOS) tirando todo.

0

cita en bloque en IOS eventos de clic no se propagan hacia arriba para el elemento del cuerpo sobre los elementos, a excepción de algunos casos (enlaces, los insumos, los elementos con los eventos adjuntos, etc.)

Esto me ayudó a enourmously - - Gracias.

Un elemento de UX que ha surgido en las pruebas de usuario de nuestra aplicación web es que la interacción con iOS para elementos seleccionados es pésima. Requiere 3 clics: 1) haga clic en el elemento selector, 2) haga clic en el elemento que desea seleccionar, 3) haga clic en Listo. Y no hay ningún evento que pueda encontrar que se dispare cuando hace clic en Listo. Entonces, para listas cortas, puede ser mejor crear su propio menú emergente u otra interacción.

0

overflow: scroll no es compatible con Android 2.3

usted tiene que hacer manualmente el desplazamiento divs (+ touchmove cambio scrollTop) si están en contenedores

hay un error desagradable en cuadros de selección en Android 2.3 no se activará si ellos o su contenedor, se ha ocultado en cualquier punto

http://code.google.com/p/android/issues/detail?id=10280

Cuestiones relacionadas