Modifiqué la solución javascript de @ ecmanaut para hacer dos cosas.
- Uso modernizr, por lo que pondrá una clase .touch css en el nodo html, por lo que puedo detectar pantallas táctiles en lugar de utilizar la detección de agente de usuario. Tal vez haya un enfoque de "modernizr-less", pero no lo sé.
- Separa cada "clic" para que ocurran por separado, si hace clic una vez, hará clic una vez, si hace clic rápidamente en el botón/disparador, contará varias veces.
- cambios menores en el formato del código, prefiero que cada var se defina por separado, etc., esto es más un "yo" que otra cosa, supongo que podría revertir eso, no pasará nada malo.
Creo que estas modificaciones hacen que sea mejor, porque puedes incrementar un contador 1,2,3,4 lugar de 2,4,6,8
aquí es el código modificado:
// jQuery no-double-tap-zoom plugin
// Triple-licensed: Public Domain, MIT and WTFPL license - share and enjoy!
//
// [email protected]: I modified this to
// use modernizr and the html.touch detection and also to stop counting two
// clicks at once, but count each click separately.
(function($) {
$.fn.nodoubletapzoom = function() {
if($("html.touch").length == 0) return;
$(this).bind('touchstart', function preventZoom(e){
var t2 = e.timeStamp;
var t1 = $(this).data('lastTouch') || t2;
var dt = t2 - t1;
var fingers = e.originalEvent.touches.length;
$(this).data('lastTouch', t2);
if (!dt || dt > 500 || fingers > 1){
return; // not double-tap
}
e.preventDefault(); // double tap - prevent the zoom
// also synthesize click events we just swallowed up
$(this).trigger('click');
});
};
})(jQuery);
la aplicar el nodoubletapzoom() a la etiqueta del cuerpo, como este
$("body").nodoubletapzoom();
su construcción html, debe ser algo como esto
<body>
<div class="content">...your content and everything in your page</div>
</body>
Luego, en su Javascript, vincular a su clic manipuladores como esto
$(".content")
.on(".mydomelement","click",function(){...})
.on("button","click",function(){...})
.on("input","keyup blur",function(){...});
// etc etc etc, add ALL your handlers in this way
puedes usar cualquier controlador de eventos de jQuery y cualquier nodo dom. ahora no tienes que hacer nada más que eso, tienes que conectar todos los manejadores de eventos de esta manera, no lo he intentado de otra manera, pero de esta manera funciona absolutamente sólido, puedes literalmente golpear la pantalla 10 veces por segundo y duerma zoom y registra los clics (obviamente no 10 por segundo, el iPad no es tan rápido, lo que quiero decir es, no se puede disparar el zoom)
Creo que esto funciona porque está adjuntando el nozoom manipular al cuerpo y luego asociar todos los manejadores de eventos al nodo ".content", pero delegando al nodo específico en cuestión, por lo tanto, jquery captura a todos los manejadores en la última etapa antes de que el evento suba a la etiqueta corporal.
El principal beneficio de esta solución es que solo tiene que asignar el manejador nodoubletapzoom() al cuerpo, solo lo hace una vez, no una vez para cada elemento, por lo que requiere menos trabajo, esfuerzo y pensamiento para poder terminar las cosas.
esto tiene la ventaja adicional de que si agrega contenido usando AJAX, automáticamente tienen los controladores listos y en espera, supongo que si usted NO QUISIERA eso, entonces este método no funcionará para usted y tendrá que ajústalo más
He verificado que este código funciona en ipad, es realmente hermoso, ¡bien hecho a @ecmanaut por la solución principal!
** Modificado el sábado 26 de mayo debido a que encontré lo que parece ser una solución perfecta con un esfuerzo absolutamente mínimo
He usado esta solución de hecho ... ¡Este tema está realmente detallado, gracias! Para los visitantes, la idea principal es la siguiente: Primero, atrapa un evento de "toque". Luego, si se lanza otro evento "toque" antes de 500ms: es un "toque doble", por lo que si puede detener el evento aquí -> sin "doble toque" :) Consulte el enlace para obtener más explicaciones. – Nicolas