2013-07-30 13 views
17

Sto tentando di acquisire coordinate di tocco sull'evento touchend ma ottenere undefined. L'evento touchstart funziona correttamente, ma lo stesso concetto non riesce su touchend. Ho creato questo codice con mousedown e mouseup e that funziona bene.Come catturare le coordinate del touch-end?

Cosa mi manca?

div.addEvent("touchstart", function (event) { 
    event.preventDefault(); // to avoid scrolling 
    span.innerHTML = event.page.x; 
}); 
div.addEvent("touchend", function (event) { 
    span.innerHTML = event.page.x; 
}); 

FIDDLE

risposta

23

avete bisogno di memorizzare i valori su touchmove e leggerlo in touchend.

var lastMove = null; 

// Save the touchstart to always have a position 
div.addEvent('touchstart', function(event) { 
    lastMove = event; 
}); 

// Override with touchmove, which is triggered only on move 
div.addEvent('touchmove', function(event) { 
    lastMove = event; 
}); 
+0

Era così facile? Grazie! Perché funziona senza 'mousemove' su' mouseup'? – Rikard

+1

Che io non sappia. E avrei immaginato che quell'evento di tocco avrebbe incluso la posizione in cui è finito, ma forse ci sono casi d'angolo dove non è possibile dare, come quando il tocco esce dall'area (non è possibile dare un valore esplicito del ** corrente ** anche se il precedente era noto). 'mouseup' quindi di nuovo * sempre * all'interno dell'area e' mouseout' viene utilizzato quando si esce dall'area. – adrenalin

+0

Ha senso. Grazie ancora! – Rikard

19

Ho cercato in specification, i 4 eventi di tocco ereditano dall'oggetto touchEvent, che ha 3 atributes elenco contenente le informazioni su tutti i tocchi (ogni dito sullo schermo) al momento della evento, ogni elenco salva i tocchi in base a questi criteri:

changedTouches: Salva i tocchi che sono fuori dalla superficie dell'elemento mirato.

touches: salva tutti i tocchi correnti.

targetTouch: Salva tutti i tocchi correnti che si trovano all'interno della superficie dell'elemento di destinazione.

Il touchend dell'evento salva la posizione in cui il dito è stato sollevato a changedTouches e il nulla viene salvato in nessuno degli altri elenchi, quindi se è necessario accedere a questo, è necessario utilizzare event.changedTouches[event.changedTouches.length-1], questo restituisce un oggetto tocco con pageX e Pagina Y attribuisce per coordinate.
L'intera linea sarebbe:

span.innerHTML = event.changedTouches[event.changedTouches.length-1].pageX;


Quello che non sono stato in grado di capire ancora è se non c'è coordinare atributes nell'oggetto touchEvent, perché si arriva a usarli in occasione di eventi TouchStart e TouchMove, e non con touchend. Forse l'implementazione ha aggiunto questa scorciatoia o mi sono sbagliato.

+0

Questo è esattamente ciò di cui avevo bisogno. Su alcuni dispositivi il touchmove non viene attivato se il movimento è più simile a un tocco. Quindi l'archiviazione dell'evento da touchmove non funzionava. Questo metodo funziona sempre. :) –

+0

è e.originalEvent.changedTouches [...] – rttmax

+0

originalEvent non è definito per l'oggetto evento trovato nel gestore per touchend. –

2

Si dovrebbe usare changedTouches invece touches in touchend

div.addEvent("touchstart", function (event) { 
    event.preventDefault(); // to avoid scrolling 
    span.innerHTML = event.pageX; 
}); 
div.addEvent("touchend", function (event) { 
    span.innerHTML = event.changedTouches[0].pageX; 
}); 
0
touchStart(event) { 
    this.startX = event.touches[0].pageX; 
}, 
touchEnd(event) { 
    this.endX = event.changedTouches[0].pageX; 
}, 
+1

Potresti ampliare la tua risposta fornendo ulteriori informazioni? Bastano solo una o due frasi per spiegare il tuo codice. – Frits

1

Anche se la questione non ha chiesto per jQuery, provare questo codice, se avete bisogno di un jQuery alternativo. Funziona su tutte le ultime versioni di jQuery.

$(document).on('touchstart', '.className', function (e) { 
    console.log(e.originalEvent.touches[0].pageX); 
}); 
$(document).on('touchend', '.className', function (e) { 
    console.log(e.originalEvent.changedTouches[0].pageX); 
}); 

Opzionalmente si può omettere 'originalEvent', e utilizzare '' per changedTouches JS solo script e jQuery/browser che non supporta.