2011-01-24 8 views
90

Sto provando a ottenere la posizione X con jQuery di un evento touchstart, usato con la funzione live?Esiste un equivalente alla posizione e.PageX per l'evento "touchstart", così come esiste per l'evento click?

I.e.

$('#box').live('touchstart', function(e) { var xPos = e.PageX; }); 

Ora, questo funziona con "clic" come evento. Come mai (senza usare lo jQuery Mobile) mi capita con un evento di tocco?

Qualche idea?

Grazie per qualsiasi aiuto.

+0

Ho trovato questo per coloro che stanno avendo bisogno aiuto su questo: - http: // StackOverflow .com/questions/3183872/does-jquery-preserve-touch-events-properties Funziona anche su touchstart. – waxical

risposta

153

Un po 'tardi, ma devi accedere all'evento originale, non a quello massaggiato da jQuery. Inoltre, poiché si tratta di eventi multi-tocco, altre modifiche devono essere fatte:

$('#box').live('touchstart', function(e) { 
    var xPos = e.originalEvent.touches[0].pageX; 
}); 

Se volete altre dita, si possono trovare in altri indici della lista tocchi.

AGGIORNAMENTO PER PIÙ RECENTE JQuery:

$(document).on('touchstart', '#box', function(e) { 
    var xPos = e.originalEvent.touches[0].pageX; 
}); 
+0

Alla fine hai una parentesi finale mancante, dovrebbe essere:}) – SteveLacy

+0

Giusto sei. Sorpreso, nessuno lo ha notato da 2 anni! =) Grazie! – mkoistinen

+0

Purtroppo non ha funzionato per me, ho finito per dover ottenere la xey sul primo 'touchmove'. – andrewb

0

Controllare Safari developer reference on Touch class.

In base a questo, paginaX/Y dovrebbe essere disponibile - forse dovresti controllare l'ortografia? assicurati che sia pageX e non PageX

33

Io uso questa semplice funzione per il progetto basato JQuery

var pointerEventToXY = function(e){ 
     var out = {x:0, y:0}; 
     if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){ 
     var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; 
     out.x = touch.pageX; 
     out.y = touch.pageY; 
     } else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') { 
     out.x = e.pageX; 
     out.y = e.pageY; 
     } 
     return out; 
    }; 

esempio:

$('a').on('mousedown touchstart', function(e){ 
    console.log(pointerEventToXY(e)); // will return obj ..kind of {x:20,y:40} 
}) 

speranza che questo sarà utile per voi;)

+2

Molto utile, grazie. –

+10

Non è necessario controllare il tipo di evento perché e.pageX non sarà definito per gli eventi di tocco. Basta fare 'out.x = e.pageX || e.originalEvent.touches [0] .pageX; ' – Griffin

+1

Prima di restituire aggiungo questa parte per ottenere la posizione percentuale basata sull'elemento genitore nel caso in cui aiuti chiunque ... \t \t var offsetParent = e.target.offsetParent ; \t \t var parentLeft = e.target.offsetParent.offsetLeft; \t \t out.percentX = (out.x - offsetParent.offsetLeft)/offsetParent.offsetWidth; \t \t out.percentY = (out.y - offsetParent.offsetTop)/offsetParent.offsetHeight; \t \t return out; – sradforth

8

Ho provato alcune delle altre risposte qui, ma originaleEvent era anche indefinito. Al momento dell'ispezione, trovato una struttura TouchList classificato (come suggerito da un altro poster) e siamo riusciti a raggiungere pageX/Y in questo modo:

var x = e.changedTouches[0].pageX; 
+1

funziona bene per tutti i codici basati su javascript. vite jquery – Martian2049

Problemi correlati