如何重播鼠标坐标列表以反映输入的节奏?

IT技术 javascript reactjs
2021-05-12 19:04:31

我想创建自己的客户端鼠标跟踪器,它将数据发送到数据库,我可以获得数据,但我不确定如何以与最初输入的方式完全匹配的方式重放数据。

对于每个 'onmousemove' 事件,我将坐标保存在一个数组中,每隔一秒我就会将该数组放入另一个数组中。

Array(2)[
  Array(34)
  0:{x: 393, y: 176}
  1:{x: 393, y: 175}
  2:{x: 393, y: 176}
  3:{x: 388, y: 182}
  4:{x: 383, y: 189}
  5:{x: 379, y: 195}
Array(6)
  0:{x: 393, y: 176}
  1:{x: 393, y: 175}
  2:{x: 393, y: 176}
  3:{x: 388, y: 182}
  4:{x: 383, y: 189}
  5:{x: 379, y: 195}
]

我显然没有考虑清楚,因为我的逻辑在重播阶段崩溃了,我以为我会每秒迭代一个嵌套数组,但这会发生得非常快,然后我想也许将一秒除以数组中的元素数量。

数组 1 有 10 个元素,因此时间间隔将每 100 毫秒触发一次以移动光标,这仍然不是正确的解决方案,因为用户可能在第二个的前半部分创建了所有坐标,而在后半部分没有创建导致重播丢失所有真正的用户动态。

那么我应该以什么方式持久化数据,以便它可以被重放而不会丢失用户在重放过程中的确切行为呢?

React Redux 状态与这种跟踪器相结合,理论上可以完全重放用户与应用程序的交互,这个想法让我着迷。

2个回答

为了跟踪节奏/时间,您可以将时间戳与您正在跟踪的每个事件x/y位置一起保存,然后计算它们之间的差异以使用相同的时间“重播”它们。这将允许您也将其全部存储在一个数组中,而不必导航嵌套数组。

实际上“重播”这可能很困难,因为据我所知,没有办法将鼠标实际强制到某个位置;但是,如果您只想要视觉重播,则可以使用鼠标图标进行模拟。

您可以尝试向数组添加另一个值,例如time. 使用Date.now()您可以获得执行操作的时间。这也可以消除数组内的数组(除非您需要它来做其他事情)

通过这种方式,您将获得如下所示的数组:

 [
   { x: 393, y: 176, time: 1234567890123 },
   { x: 393, y: 178, time: 1234567890125 }
 ]

然后,您可以使用 2 次之间的差值来确定这 2 次操作之间经过的时间。