【问题标题】:jQuery live() removing iPhone touch event attributes?jQuery live() 删除 iPhone 触摸事件属性?
【发布时间】:2009-03-22 19:34:20
【问题描述】:

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

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

有什么想法吗?我是 jQuery.live() 的 SOL 吗?

【问题讨论】:

    标签: jquery iphone touch live


    【解决方案1】:

    其实你可以使用 .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 中并非如此。
    • jQuery 1.3.x 具有相同的行为,复制一组公共属性并将原始事件作为 originalEvent 属性公开。相关来源:github.com/jquery/jquery/blob/1.3/src/event.js#L282
    【解决方案2】:

    Events/live 目前不支持触摸事件。

    来自文档:

    可能的事件值:点击, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup

    目前不支持:模糊、焦点、 mouseenter、mouseleave、更改、提交

    如果适合您的需要,您可能要考虑尝试使用 click,或者您可以切换到使用 livequery,这可能会支持它。 (livequery 是 live 最初基于的,我不知道为什么它不支持所有相同的事件)

    【讨论】:

    • 我会试试 livequery,谢谢。认为触摸事件被捕获了,它们得到了相当的支持,但我想必须发生一些额外的事情来传递所有事件属性。
    • 我相信 livequery 使用计时器,这就是为什么它可以支持更多。 jQuery 团队使用了另一种更有效但也有限的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多