Javascript targetTouches是否跟踪在多个元素上同时移动的触摸?
假设我有四个手指:元素A中的两个手指(1,2)和元素B中的两个手指(3,4) 假设我移动手指1和手指3 我应该看一个Javascript targetTouches是否跟踪在多个元素上同时移动的触摸?,javascript,html,events,javascript-events,multi-touch,Javascript,Html,Events,Javascript Events,Multi Touch,假设我有四个手指:元素A中的两个手指(1,2)和元素B中的两个手指(3,4) 假设我移动手指1和手指3 我应该看一个touchmove事件,它将包含changedtouchs包含手指1和3 但是,targetTouchs将包含什么?它将包含1和2,或3和4,或全部4 对于1和2在同一个元素上,而3和4都在不同的元素上,提供足够信息的唯一方法似乎是发送两个 您愿意在jsfiddl上进行测试吗
touchmove
事件,它将包含changedtouchs
包含手指1和3
但是,targetTouchs
将包含什么?它将包含1和2,或3和4,或全部4
对于1和2在同一个元素上,而3和4都在不同的元素上,提供足够信息的唯一方法似乎是发送两个
事件
我正在构建一个触摸框架,我正在构建一个全局数据结构,跟踪所有手指及其目标,因此我确实知道发生了什么,但我想知道如果targetTouches
事件能够为我提供所有必要的信息,是否可以完全跳过这一步
我在我的页面上用touchstart
对其进行了测试:
document.touchstart = function(evt) { console.log("touchstart", evt.targetTouches); }
我按上面描述的顺序放下四个手指。接下来,我将尝试了解targetTouches在
touchmove
中包含哪些内容,这是一项更困难的任务,因为它生成了多少数据 我将在下面的iOS6.0(iPhone 5)、iOS5.1.1(iPad 3)、Android 4.2.1上的Nexus 7(Chrome 18.0.1025469)和Nexus 7上的Firefox for Android 17上发布我的发现
目前只有来自iPhone5的数据。这是一个很大的工作
我所做的是在页面和touchstart
调用preventDefault()
以防止滚动。然后我让touchmove
计算其changedtouche
和targettouche
缓冲区的长度,并在DOM中显示。此外,我还计算了这些事件的发生率。下面是一段代码:
// exposed is a variable which other code uses rAF to present a representation of it on the DOM so I can view it
touchmove: function(evt) {
evt.preventDefault();
var time = Date.now();
var diff = time - exposed.touch_move_last_time;
if (!exposed.touch_move_last_time) exposed.touch_move_last_time = Date.now();
if (!exposed.touch_move_rate) exposed.touch_move_rate = 0;
exposed.touch_move_last_time = time;
exposed.touch_move_rate += (diff - exposed.touch_move_rate)*0.01;
exposed.touch_move_changedTouches_count = evt.changedTouches.length;
exposed.touch_move_targetTouches_count = evt.targetTouches.length;
当我移动手指时,我将其移动成一个圆圈,而不是Z字形,因为在Z字形点,它可以触发的事件少于采样率。由于收敛速度较低(这是为了产生不保持波动的数字),需要持续摩擦大约5秒钟才能使读数稳定在采样率上
iOS6.0:
将两个手指放在一个元素中,并移动一个手指:changedTouches
size:1(移动的那一个)targetTouches
size:2(元素上的两个手指)采样率:16.66ms 将两个手指放在一个元素中,然后左右移动:
changedtouchs
size:2(两个都在移动)targetTouches
size:2(元素上的两个手指)采样率:16.66ms 在每个元素中放下一个手指并移动一个手指:
changedTouches
size:1(移动的那一个)targetTouches
size:1(指移动对象最初接触的元素)采样率:16.66ms 在每个元素中放下一个手指,然后左右移动两个手指:
changedTouches
size:1(移动的那一个)targetTouches
size:1(指移动对象最初接触的元素)采样率:8.29ms 在第一个元素中放下一个手指,在第二个元素中放下两个手指:
如果在第二个元素中移动一个手指
changedTouches
size:1targetTouches
size:2采样率:16.66ms 如果在第二个元素中移动两个手指
changedtouchs
size:2targetTouches
size:2采样率:16.6ms(很难保持第一个手指不动) 如果在第一个元素中移动手指
changedTouches
size:1targetTouches
size:1采样率:16.66ms 如果在第一个元素中移动手指,在第二个元素中移动一个手指
changedTouches
size:1targetTouches
size:在1和2之间波动采样率:8.29ms 如果移动所有三个手指
changedTouches
size:在1和2之间波动targetTouches
size:2
采样率:约8.3ms
在每个元素中放下两个手指,在每个元素中移动一个:changedTouches
size:1targetTouches
size:2采样率:约9ms 很明显,在采样率为~120Hz的所有情况下,我至少有两个元素的手指在其中移动,这显然表明它将为每个同时触摸的元素触发一个单独的
touchmove
。我敢打赌,将测试扩展到3个元素将看到180Hz的采样率。更新:我在iPad上测试了3个元素,它的读数为5.4ms
我有点好奇的是为什么我总是得到8.29毫秒而不是8.33毫秒。9ms的读取可能只是因为它的处理量超过了全速处理的能力(因为我让DOM每帧更新一次)
另一更新:
在Nexus 7上的Chrome上,changedTouches
缓冲区似乎总是充满了所有触摸,因为每次触摸webkitForce
读数总是在变化。它也是如此缓慢,以至于采样率读数提供的有用信息为零。但通过更改页面上最后一个有序元素中的手指数,可以看出touchmove
事件也在每个元素的基础上正确触发
Nexus7上的Firefox在生成合理的采样率读数方面稍有优势,但显示器的更新速度甚至比Chrome更慢。直到Firefox变得不那么波涛汹涌,我认为它不值得让代码正确地工作。p> 您愿意在jsfiddl上进行测试吗