2011-01-21 15 views

Respuesta

210

Core jQuery no tiene nada especial para eventos de toque, pero se puede construir fácilmente su propio uso de los siguientes eventos

  • touchstart
  • touchmove
  • touchend
  • touchcancel

Por ejemplo, touchmove

document.addEventListener('touchmove', function(e) { 
    e.preventDefault(); 
    var touch = e.touches[0]; 
    alert(touch.pageX + " - " + touch.pageY); 
}, false); 

Esto funciona en la mayoría de los navegadores basados ​​en webkit (incl. androide).

Here is some good documenation:

+2

Muchas gracias David, creo que funcionará, pero ¿qué es e.touches [0]? ¿Puedes describir el argumento "e" en detalle? –

+7

e es el objeto de evento que se pasa automáticamente al controlador. Para el navegador safari (y también para Android) ahora contiene una matriz de todos los toques que el usuario ha realizado en la pantalla. Cada toque tiene sus propias propiedades (x, y coords, por ejemplo) –

+0

Gracias David. esta bien, entendí. –

5

Yo estaba un poco preocupado por el uso de solamente touchmove para mi proyecto, ya que sólo se parece al fuego cuando sus táctil se mueve de un lugar a otro (y no en el contacto inicial). Así que lo combiné con touchstart, y esto parece funcionar muy bien para el toque inicial y cualquier movimiento.

<script> 

function doTouch(e) { 
    e.preventDefault(); 
    var touch = e.touches[0]; 

    document.getElementById("xtext").innerHTML = touch.pageX; 
    document.getElementById("ytext").innerHTML = touch.pageY; 
} 

document.addEventListener('touchstart', function(e) {doTouch(e);}, false); 
document.addEventListener('touchmove', function(e) {doTouch(e);}, false); 

</script> 

X: <div id="xtext">0</div> 
Y: <div id="ytext">0</div> 
+0

También agregué esto para detectar cuánto tiempo pasó desde el último evento ... 'document.getElementById (" ttime "). innerHTML = ((new Date()) - touchTime); touchTime = new Date(); ' – hanamj

22

El enfoque más simple es utilizar un multitouch JavaScript library like Hammer.js. A continuación, puede escribir el código como:

canvas 
    .hammer({prevent_default: true}) 
    .bind('doubletap', function(e) { // And double click 
     // Zoom-in 
    }) 
    .bind('dragstart', function(e) { // And mousedown 
     // Get ready to drag 
    }) 
    .bind('drag', function(e) { // And mousemove when mousedown 
     // Pan the image 
    }) 
    .bind('dragend', function(e) { // And mouseup 
     // Finish the drag 
    }); 

Y puede seguir adelante. Es compatible con tocar, tocar dos veces, deslizar, mantener, transformar (es decir, pellizcar) y arrastrar. Los eventos táctiles también se activan cuando ocurren acciones de mouse equivalentes, por lo que no es necesario escribir dos conjuntos de controladores de eventos. Ah, y necesitas el plugin jQuery si quieres poder escribir en la forma jQuery como yo lo hice.

+18

la solución" más simple "nunca implica complicar más un problema agregando bibliotecas – Octopus

+12

@Octopus La solución más simple es usar hammer.js que abstrae los dolores de cabeza entre navegadores. Use la extensión jQuery para estar en su zona familiar. No me parece demasiado complicado. – trusktr

+1

la solución supuestamente "más simple" es a menudo la que la gente arruina más ... haga lo que haga, no se olvide de asegurarse de que su solución funcione en dispositivos compatibles con touch y mouse, como Microsoft Surface –

13

jQuery Core no tiene nada especial, pero puede leer en la página jQuery Mobile Events sobre diferentes eventos táctiles, que también funcionan en dispositivos que no sean iOS.

Ellos son:

  • grifo
  • taphold
  • golpe
  • swipeleft
  • swiperight

Nótese también, que durante los eventos de desplazamiento (basado en el tacto en los dispositivos móviles) Los dispositivos con iOS congelan la manipulación del DOM mientras se desplazan.

+0

Gracias por darme tu tiempo importante para mi pregunta. Estoy investigando los eventos de Jquery Mobile. Gracias. –

+0

Esos eventos no son realmente representativos de la interacción táctil real. – trusktr

134

Si está utilizando jQuery 1.7+ es aún más simple que todas estas otras respuestas.

$('#whatever').on({ 'touchstart' : function(){ /* do something... */ } }); 
+1

Sí, Timothy, no me utilizaron la versión 1.7+ en el momento en que comencé mi proyecto. ahora onwords Estoy usando jquery 1.7+ .. Gracias por una buena sugerencia y respuesta. Muchas gracias. :) –

+4

Esto funciona bien. Necesitaba hacer clic y tocar para hacer lo mismo, y estoy acostumbrado a la sintaxis no objetiva, como '$ ('# whatever'). On ('touchstart click', function() {/ * hacer algo ... . * /}); ' – goodeye

+0

He usado la solución Timothy Perez y funciona, pero no la solución goodeye. ¿Hay alguna forma de agregar también elementos recién agregados para cambiar el código Timothy Perez? – edonbajrami

3

Yo sé que soy un poco tarde en esto, pero acabo de probar benmajor's GitHub jQuery Touch Events plugin para ambas versiones 1.4 y 1.7+ de jQuery. Es liviano y funciona perfectamente con on y bind al mismo tiempo que brinda soporte para un conjunto exhaustivo de eventos táctiles.

15

Puede utilizar .on() para capturar múltiples eventos y luego probar para la pantalla táctil, por ejemplo:

$('#selector') 
.on('touchstart mousedown', function(e){ 
    e.preventDefault(); 
    var touch = e.touches[0]; 
    if(touch){ 
    // Do some stuff 
    } 
    else { 
    // Do some other stuff 
    } 
}); 
+0

genial .. @featherbelly.Verificaré su código –

+0

, excepto que '.bind' está en desuso. Deberías usar '.on' – jcuenod

13

Usando touchstart o touchEnd por sí sola no es una buena solución, porque si se desplaza a la página, el dispositivo detecta como tocar o tocar también. Entonces, la mejor manera de detectar un evento de tocar y hacer clic al mismo tiempo es simplemente detectar los eventos táctiles que no están moviendo la pantalla (desplazamiento). Para hacer esto solo agregue este código a su aplicación:

$(document).on('touchstart', function() { 
    detectTap = true; //detects all touch events 
}); 
$(document).on('touchmove', function() { 
    detectTap = false; //Excludes the scroll events from touch events 
}); 
$(document).on('click touchend', function(event) { 
    if (event.type == "click") detectTap = true; //detects click events 
     if (detectTap){ 
      //here you can write the function or codes you wanna execute on tap 

     } 
}); 

Lo probé y funciona bien para mí en iPad y iPhone. Detecta el toque y puede distinguir el toque y el desplazamiento fácil.

+1

Esta solución parece ser la más simple que he encontrado y parece funcionar muy bien en iOS. –

+0

Primero usé jquery mobile, pero luego interfirió con otras funcionalidades. Estoy usando esto ahora y funciona perfecto. No hay problemas hasta el momento. –

Cuestiones relacionadas