【问题标题】:Mobile Safari (iOS 9) Touch.clientX/Y not reified at time of dispatch?移动 Safari (iOS 9) Touch.clientX/Y 在发送时未具体化?
【发布时间】:2017-03-22 14:11:16
【问题描述】:

计算touchmove 事件之间的增量的简单方法可能如下所示:

var lastEvent;
window.addEventListener('touchmove', function(event) {
  if (lastEvent) {
    console.log(event.touches[0].clientY - lastEvent.touches[0].clientY);
  }
  lastEvent = event;
});

不过,在 iOS 9 上,对于连续的 touchmove 事件(夹在相同的 touchstarttouchend 事件之间),此增量始终为 0

在 iOS 10 上,增量的计算方式如您所料。

我不明白为什么!

【问题讨论】:

    标签: javascript ios touch ios9 mobile-safari


    【解决方案1】:

    修改示例以添加额外的检查:

    var lastEvent;
    window.addEventListener('touchmove', function(event) {
      if (lastEvent) {
        console.log('same event?', event === lastEvent)
        console.log('same touch?', event.touches[0] === lastEvent.touches[0])
        console.log('delta', event.touches[0].clientY - lastEvent.touches[0].clientY);
      }
      lastEvent = event;
    });
    

    产量:

    same event? false
    same touch? true
    delta 0
    

    iOS 9 似乎每次调度都会创建新的事件对象,但是回收touches 数组中的Touch 对象。

    代码在 iOS 10 中按预期工作,因为它似乎没有执行相同的 Touch 对象池。

    我会将此标记为答案,但如果有人碰巧知道任何相关的内容:WebKit 中的触摸对象回收或相关优化(我假设这是一种优化...),请分享!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2016-01-05
      相关资源
      最近更新 更多