Come posso riconoscere gli eventi touch usando jQuery in Safari per iPad? È possibile?


192

È possibile riconoscere eventi touch sul browser Safari dell'iPad utilizzando jQuery?

Ho usato gli eventi mouseOver e mouseOut in un'applicazione web. Ci sono eventi simili per il browser Safari dell'iPad poiché non ci sono eventi come mouseOut e mouseMove?

Risposte:


240

Core jQuery non ha nulla di speciale per gli eventi touch, ma puoi facilmente crearne uno tuo usando i seguenti eventi

  • TouchStart
  • touchmove
  • touchend
  • touchcancel

Ad esempio, il touchmove

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

Funziona con la maggior parte dei browser basati su WebKit (incluso Android).

Ecco della buona documentazione .


2
Grazie mille David, penso che funzionerà, ma cos'è e.touches [0]? puoi descrivere l'argomento "e" in dettaglio?
Abhishek B.

7
e è l'oggetto evento che viene automaticamente passato al gestore. Per il browser Safari (e anche Android) ora contiene una serie di tutti i tocchi che l'utente ha fatto sullo schermo. Ogni tocco ha le sue proprietà (ad esempio x, y coords)
David Pean,

1
ora come si fa a trovare quale elemento attivare l'evento su -__-
Muhammad Umer,

Nota che la risposta giusta è quella fatta da Timothy Perez, questa non è aggiornata.
EPurpl3,

149

Se stai usando jQuery 1.7+ è ancora più semplice di tutte queste altre risposte.

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

1
Sì, Timothy, non ho usato la versione 1.7+ quando ho iniziato il mio progetto. ora onwords sto usando jquery 1.7+ .. Grazie per il buon suggerimento e risposta .. Grazie mille. :)
Abhishek B.

7
Funziona bene Avevo bisogno di fare clic e di iniziare a fare lo stesso per fare la stessa cosa, e sono abituato alla sintassi non-oggetto, come$('#whatever').on('touchstart click', function(){ /* do something... */ });
addio

1
quando vado $('#whatever').on({ 'touchstart' : function(ev){}});, evnon sembra avere alcuna informazione sui tocchi (tocchi, tocchi target o tocchi modificati)
Polpo

8
@Octopus: sotto troverai le informazioni sui tocchi ev.originalEvent.
Peter Bloomfield,

1
@edonbajrami sì, certo. controlla i documenti e cerca "eventi delegati". $ ("# elemento da monitorare per nuovi elementi"). on ("eventX", "#element", funzione (evento) {/ * qualunque * /});
honk31,

24

L'approccio più semplice è utilizzare una libreria JavaScript multitouch come Hammer.js . Quindi puoi scrivere codice come:

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
    });

E puoi andare avanti. Supporta tocca, tocca due volte, scorri, tieni premuto, trasforma (ovvero pizzica) e trascina. Gli eventi tattili si attivano anche quando si verificano azioni del mouse equivalenti, quindi non è necessario scrivere due set di gestori di eventi. Oh, e hai bisogno del plugin jQuery se vuoi essere in grado di scrivere nel modo jQueryish come ho fatto io.


29
la soluzione "più semplice" non comporta mai la complicazione di un problema con l'aggiunta di librerie
Octopus

13
@Octopus La soluzione più semplice è usare hammer.js che elimina il mal di testa tra browser. Usa l'estensione jQuery per trovarti nella tua zona familiare. Non mi sembra troppo complicato.
Trusktr,

1
la presunta soluzione "più semplice" è spesso quella che la gente rovina di più ... qualunque cosa tu faccia, non dimenticare di assicurarti che la tua soluzione funzioni su dispositivi che supportano sia il tocco che il mouse, come Microsoft Surface
Simon_Weaver

1
@Octopus: "Quando tutto ciò che hai è un martello [sic] ... tutto sembra un chiodo" :)
Gone Coding

È TEMPO DEL MARTELLO! Grazie per aver condiviso questa libreria, è stato facile installarlo sulla mia applicazione e iniziare! Ci è voluto un secondo per l'installazione perché il gestore eventi è diverso, ma un semplice console.log (evento) ti dice di cosa hai bisogno. GRAZIE!
Andy,

24

L'uso del touchstart o del touchend da solo non è una buona soluzione, perché se si scorre la pagina, il dispositivo la rileva anche come tocco o tocco. Quindi, il modo migliore per rilevare un evento tocca e fai clic allo stesso tempo è semplicemente rilevare gli eventi touch che non muovono lo schermo (scorrimento). Quindi, per fare ciò, aggiungi questo codice alla tua applicazione:

$(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 want to execute on tap

       }
 });

L'ho provato e funziona bene su iPad e iPhone. Rileva il tocco e può distinguere facilmente il tocco e il tocco.


2
Questa soluzione sembra essere la più semplice che abbia mai trovato e sembra funzionare perfettamente su iOS.
Joshua Lawrence Austill,

Ho usato prima jquery mobile, ma poi ha interferito con altre funzionalità. Lo sto usando ora e funziona perfettamente. Nessun problema finora.
Anurag Priyadarshi,

18

È possibile utilizzare .on () per acquisire più eventi e quindi testare il tocco sullo schermo, ad esempio:

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

tranne che .bindè deprecato. Dovresti usare.on
jcuenod il

15

jQuery Core non ha nulla di speciale, ma puoi leggere sulla pagina degli eventi jQuery Mobile su diversi eventi touch, che funzionano anche su dispositivi diversi da iOS.

Loro sono:

  • rubinetto
  • taphold
  • rubare
  • scorrere verso sinistra
  • swiperight

Si noti inoltre che durante gli eventi di scorrimento (basati sul tocco sui dispositivi mobili) i dispositivi iOS bloccano la manipolazione del DOM durante lo scorrimento.


Grazie per dare il tuo tempo importante per la mia domanda. Sto esaminando gli eventi di Jquery Mobile .. Grazie.
Abhishek B.

Questi eventi non sono veramente rappresentativi della vera interazione tattile.
Trusktr,

JQuery Core è un vero nome vero?
Peter Mortensen,

6

Ero un po 'preoccupato di usare solo touchmove per il mio progetto, poiché sembra sparare solo quando il tuo tocco si sposta da una posizione all'altra (e non al tocco iniziale). Quindi l'ho combinato con il touchstart , e questo sembra funzionare molto bene per il tocco iniziale e qualsiasi movimento.

<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>

Ho anche aggiunto questo per rilevare quanto tempo è trascorso dall'ultimo evento ..document.getElementById("ttime").innerHTML = ((new Date()) - touchTime); touchTime = new Date();
Hanamj,

3

Ho appena testato il plug-in GitHub jQuery Touch Events di benmajor per entrambe le versioni 1.4 e 1.7+ di jQuery. È leggero e funziona perfettamente con entrambi one, allo stesso bindtempo, fornisce supporto per un set completo di eventi touch.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.