2009-03-22 10 views
6

Sono eventi live vincolanti sui collegamenti nella mia app PhoneGap. L'evento viene attivato correttamente (confermato da alert() ing), ma sembra che qualsiasi dato di tocco non sia collegato all'oggetto evento come dovrebbe essere. Ciò si verifica in tutti gli eventi touch - touchstart, touchmove e touchend.jQuery live() rimuove gli attributi degli eventi tattili di iPhone?

$('a').live('touchend', function(event) { 
    event.preventDefault(); 
    alert(event.touches.length); // event.touches should be populated! 
}); 

Qualche idea? Sono SOL con jQuery.live()?

risposta

2

Gli eventi di tocco non sono attualmente supportati da Events/live.

Dalla documentazione:

possibili valori degli eventi: cliccare, DoppioClic, MouseDown, MouseUp, MouseMove, mouseover, mouseout, keydown, pressione di un tasto, keyup

Attualmente non supportato: sfocatura, focus, mouseenter, mouseleave, cambia, invia

Si potrebbe voler provare a utilizzare il clic se che soddisferà le tue esigenze, oppure puoi passare all'uso di livequery, che probabilmente lo supporterà. (livequery è ciò su cui originariamente era basato il live, non sono sicuro del motivo per cui non supporta tutti gli stessi eventi)

+0

Cercherò fuori livequery, grazie. Ritenuto che gli eventi tattili fossero stati scoperti, erano abbastanza supportati, ma suppongo che debba succedere qualcosa in più per trasmettere tutti gli attributi dell'evento. – ceejayoz

+0

Credo che livequery usi i timer ed è per questo che può supportare molto di più. Il team jQuery ha utilizzato un metodo diverso che è più efficiente, ma anche limitato. – Jab

16

In realtà, è possibile utilizzare il metodo .live. Non hai la proprietà event.touches a causa del modo in cui jQuery gestisce gli eventi internamente. Per "riparare" gli eventi, jQuery clona l'evento. In tal modo, copia solo su un numero limitato di proprietà per motivi di prestazioni. Tuttavia, è ancora possibile accedere all'oggetto evento originale tramite la proprietà event.originalEvent.

Così il vostro codice di esempio avrebbe bisogno di simile al seguente:

$('a').live('touchend', function(event) { 
    event.preventDefault(); 
    console.log(event.originalEvent.touches.length); 
}); 

Qui ci sono le proprietà che vengono copiati su: http://github.com/jquery/jquery/blob/master/src/event.js#L411

+0

Questo sembra essere vero nel nuovo jQuery 1.4. Non era il caso in 1.3. – ceejayoz

+1

jQuery 1.3.x ha avuto lo stesso comportamento, per copiare su un determinato numero di proprietà comuni ed esporre l'evento originale come proprietà originalEvent. Fonte pertinente: http://github.com/jquery/jquery/blob/1.3/src/event.js#L282 –