2009-03-22 7 views
6

Je lie des événements en direct sur des liens dans mon application PhoneGap. L'événement se déclenche avec succès (confirmé par alert() ing), mais il semble que les données tactiles ne sont pas attachées à l'objet d'événement comme il se doit. Cela se produit sur tous les événements tactiles - touchstart, touchmove et touchend.jQuery live() Suppression des attributs d'événement Touch iPhone?

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

Des idées? Suis-je SOL avec jQuery.live()?

Répondre

2

Les événements tactiles ne sont actuellement pas pris en charge par Events/live.

De la documentation:

valeurs d'événement possibles: cliquez, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyUp

pas pris en charge: flou, focus, mouseenter, mouseleave, modifier, soumettre

Vous pouvez envisager d'essayer de cliquer si cela va répondre à vos besoins, ou vous pouvez passer à l'utilisation livequery, qui le soutiendra probablement. (livequery est ce qui était à l'origine basé live, je ne sais pas pourquoi il ne supporte pas tous les mêmes événements)

+0

Je vais essayer livequery, merci. Figuré comme les événements tactiles ont été attrapés OK qu'ils étaient assez pris en charge, mais je suppose que quelque chose de plus doit arriver pour transmettre tous les attributs de l'événement. – ceejayoz

+0

Je crois que livequery utilise des minuteurs et c'est pourquoi il peut supporter beaucoup plus. L'équipe de jQuery a utilisé une méthode différente, plus efficace mais limitée. – Jab

16

En fait, vous pouvez utiliser la méthode .live. Vous n'avez pas la propriété event.touches en raison de la façon dont jQuery gère les événements en interne. Pour "réparer" les événements, jQuery clone l'événement. Ce faisant, il ne copie que sur un nombre limité de propriétés pour des raisons de performances. Toutefois, vous pouvez toujours accéder à l'objet d'événement d'origine via la propriété event.originalEvent.

Ainsi, votre exemple de code aurait besoin de ressembler à ce qui suit:

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

Voici les propriétés qui sont copiés: http://github.com/jquery/jquery/blob/master/src/event.js#L411

+0

Cela semble être vrai dans le nouveau jQuery 1.4. Ce n'était pas le cas en 1.3. – ceejayoz

+1

jQuery 1.3.x avait le même comportement, copier sur un nombre défini de propriétés communes et exposer l'événement d'origine en tant que propriété originalEvent. Source pertinente: http://github.com/jquery/jquery/blob/1.3/src/event.js#L282 –

Questions connexes