2010-07-06 14 views
18

Mentre questo codice produce il comportamento previsto di "1" quando si tocca lo schermo:jQuery conserva le proprietà degli eventi di tocco?

document.getElementById('someNodeId').addEventListener('touchmove', touch, true); 

function touch(evt) { 
    evt.preventDefault(); 
    alert(evt.changedTouches.length);  
    } 

stesso codice utilizzando un selettore jQuery:

$('#someNodeId').bind('touchmove', touch); 

produce l'errore: "TypeError: Risultato di espressione 'evt.changedTouches' [indefinito] non è un oggetto ".

(Dispositivo = iPod Touch OS 3.1.3 (7E18); jQuery 1.4.2).

Com'è possibile e cosa sto sbagliando?

risposta

33

Prova

$(document).ready (function() { 
    $("#someNodeId").bind("touchmove", function (event) { 
     var e = event.originalEvent; 
     console.log(e.targetTouches[0].pageX); 
    }); 
}); 
+2

un la spiegazione del perché 'originalEvent' sarà necessario utile per OP e altri che non hanno familiarità con la normalizzazione degli eventi di jQuery. – Anurag

+9

Infatti; la spiegazione si trova qui: http://stackoverflow.com/questions/671498/jquery-live-removing-iphone-touch-event-attributes "Per" correggere "gli eventi, jQuery clona l'evento. così facendo, copia solo su un numero limitato di proprietà per motivi di prestazioni, tuttavia è comunque possibile accedere all'oggetto evento originale tramite la proprietà event.originalEvent. " In effetti non sono sicuro che sia molto utile usare jQuery su iPhone; Ho seguito questa strada a causa di jQTouch ma ora me ne sto allontanando. – Bambax

4

Io uso questa semplice funzione di JQuery progetto basato

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('mousemove touchmove', function(e){ 
    console.log(pointerEventToXY(e)); // will return obj ..kind of {x:20,y:40} 
}) 

speranza che questo sarà utile per voi;)

Problemi correlati