Mobile Safari (iOS 9) Touch.clientX/Y 发货时未具体化?

Mobile Safari (iOS 9) Touch.clientX/Y not reified at time of dispatch?

计算 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 事件)。

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

我不明白为什么!

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

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 每次分派都在创建新的事件对象,但是 回收 Touch 数组中的 touches 个对象。

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

我打算将此标记为答案,但如果有人碰巧知道任何相关信息:WebKit 中的触摸对象回收或相关优化(我认为这是优化...),请分享!