Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript targetTouches是否跟踪在多个元素上同时移动的触摸?_Javascript_Html_Events_Javascript Events_Multi Touch - Fatal编程技术网

Javascript targetTouches是否跟踪在多个元素上同时移动的触摸?

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上进行测试吗

假设我有四个手指:元素A中的两个手指(1,2)和元素B中的两个手指(3,4)

假设我移动手指1和手指3

我应该看一个
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:1
targetTouches
size:2
采样率:16.66ms

如果在第二个元素中移动两个手指
changedtouchs
size:2
targetTouches
size:2
采样率:16.6ms(很难保持第一个手指不动)

如果在第一个元素中移动手指
changedTouches
size:1
targetTouches
size:1
采样率:16.66ms

如果在第一个元素中移动手指,在第二个元素中移动一个手指
changedTouches
size:1
targetTouches
size:在1和2之间波动
采样率:8.29ms

如果移动所有三个手指
changedTouches
size:在1和2之间波动
targetTouches
size:2 采样率:约8.3ms

在每个元素中放下两个手指,在每个元素中移动一个:
changedTouches
size:1
targetTouches
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上进行测试吗