servidor - Problema de desplazamiento/clic de iOS 7: no se activó ningún clic en algunos casos
contraseña exchange (5)
Tengo una especie de "widget": una tabla de datos con algunas funciones ricas como clasificación, selección de filas y demás.
En algunos casos (colocación / anidación de widgets en DOM), los clics en sus filas no se activan en iOS 7 Safari.
Widget está usando jQuery 1.6.4
No puedo publicar un código de widget completo (y realmente quiere que esto suceda;)), pero puedo reducir un escenario de reproducción al siguiente caso:
- Tabla html simple con algunas filas, dos cols en cada
- La primera columna contiene una "casilla de verificación":
divsimple que normalmente está oculta y se vuelve visible, y luego la fila principal queda suspendida. La visibilidad se activa solo con CSS - Cada fila tiene un controlador de evento
click. No importa lo que haga. En mi ejemplo, activará unaalert() - El elemento principal de la tabla es un elemento de bloque con una altura y un
overflow-yfijos que se configuran enauto - La tabla es más grande que su página principal, por lo tanto, el contenido de la tabla está oculto y se puede ver con el desplazamiento
Aquí hay un jsFiddle: http://jsfiddle.net/822eG/4/
En todos los elementos del navegador de escritorio que se ciernen con éxito, se activa el clic. En iOS7, el control deslizante está funcionando pero el clic NO está activado.
NOTA : en iOS, debe tocar dos veces para activar el click . El primer clic activará el control hover y verá una "casilla de verificación", luego el segundo toque debe activar un click , pero no ...
Cualquiera de esas condiciones es OBLIGATORIA para reproducir un problema. Elimina uno solo y comienza a funcionar ...
Si elimina una apariencia de "casilla de verificación", haga clic en funcionará ( http://jsfiddle.net/822eG/5/ ).
Si elimina una corrección de altura, funcionará ( http://jsfiddle.net/822eG/6/ ).
Si elimina un desplazamiento de desbordamiento, funcionará ( http://jsfiddle.net/822eG/8/ ).
Cualquier solución es necesaria, pero la funcionalidad debe mantenerse intacta. Por lo tanto, no puedo eliminar la "casilla de verificación", corregir tamaño, desplazarse, hacer clic o desplazar el sobredesbordamiento. Además, cambiar el marcado de HTML difícilmente sucederá.
NOTA : Tengo una solución: mira mi respuesta a continuación. Pero aún necesito una mejor solución para seguir utilizando CSS como la mayor cantidad posible.
ADD : Archivado un error en Apple # 16072132
Para que iOS ignore los estados de desplazamiento, intente esto:
.wrapper
{cursor: pointer;}
Puede usar esto en cualquier elemento para que funcione como se espera.
De repente, tengo una solución ... Utilizando JavaScript puedo eliminar :hover selector de :hover , pero aun así mantener la funcionalidad.
Si desactivo la visibilidad de casilla de verificación no por CSS :hover pero por clase y configúrelo mediante javascript, funcionará.
Prueba esto:
.wrapper {
-webkit-overflow-scrolling: touch;
}
..tratar usando esto:
$(''.row'').on(''touchstart click'', function(){
alert(''clicked'');
});
Mi solución de trabajo actual no requiere ningún cambio en toda la base de códigos y funciona bien en nuestras condiciones
- Con
MutationObserver, monitoree la inserción del nodo en lahead - Si se inserta un nuevo nodo, y este es un
link, consultedocument.styleSheets - Para cada hoja, compruebe sus reglas
- Si el selector de reglas (access by
document.styleSheets[n].rules[i].selectorText) contiene:hoverestilos de control dedocument.styleSheets[n].rules[i].selectorTextpara este selector - Si los estilos contienen una
displaydiferente denoneovisibilitydiferente devisible, este es un estilo "mostrar al pasar el mouse" - Para cada uno de estos estilos, cambie su selector - replace
:hoverpor.hovery declare unbodydelegado paramouseenterymouseleaveevents que alternarán.hoverclass en el elemento disparado
El código fuente completo aquí: https://gist.github.com/Olegas/9143277