jQuery live() 删除 iPhone 触摸事件属性?

6

我正在我的PhoneGap应用程序中绑定链接的实时事件。事件确实成功触发(通过alert()确认),但似乎任何触摸数据都没有像应该那样附加到事件对象上。这在所有触摸事件 - touchstarttouchmovetouchend上都会发生。

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

有什么想法吗?我在使用jQuery.live()时遇到了问题,是否无解?
2个回答

16

实际上,你可以使用.live方法。由于jQuery内部处理事件的方式,你没有event.touches属性。为了“修复”事件,jQuery会克隆事件。在此过程中,出于性能原因,它只复制了有限数量的属性。然而,你仍然可以通过event.originalEvent属性访问原始的事件对象。

所以你的示例代码应该像以下这样:

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

以下是被复制的属性:http://github.com/jquery/jquery/blob/master/src/event.js#L411


这在新的jQuery 1.4中似乎是正确的。在1.3中不是这种情况。 - ceejayoz
1
jQuery 1.3.x具有相同的行为,可以复制一组常见属性并将原始事件公开为originalEvent属性。相关源代码:http://github.com/jquery/jquery/blob/1.3/src/event.js#L282 - Brandon Aaron

2
触摸事件目前不受Events/live支持。
根据文档:
可能的事件值:click、dblclick、mousedown、mouseup、mousemove、mouseover、mouseout、keydown、keypress、keyup。
目前不支持:blur、focus、mouseenter、mouseleave、change、submit。
如果适合您的需求,您可以考虑尝试使用click,或者切换到使用livequery,它可能会支持触摸事件。(livequery是live最初基于的内容,我不确定为什么它不支持所有相同的事件)。

我会尝试使用livequery,谢谢。我认为由于触摸事件被很好地捕获,它们应该得到了相当的支持,但我猜还需要进行一些额外的操作才能传递所有事件属性。 - ceejayoz
我相信livequery使用计时器,这就是为什么它可以支持更多的原因。jQuery团队使用了一种不同的方法,更高效,但也有限制。 - Jab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接