JavaScript实现鼠标轨迹记录与平滑回放功能

作者:木棉

时间:2026-10-24

浏览:275

本文介绍如何使用JavaScript记录鼠标移动轨迹并实现回放功能。针对原始代码中for循环执行过快导致回放不流畅的问题,通过引入定时器结合数组下标的方法,实现了平滑的轨迹回放效果。代码包含轨迹记录、延迟处理及回放逻辑,适用于前端交互演示。

文章目录

鼠标轨迹记录与回放功能实现

遇到的问题:


Question


①:在mousemove事件中,移动方法会记录大量的left和top坐标值,但我只需要保留其中大约几组关键数据,无需记录所有点;


Question


②:在回放阶段,由于for循环执行速度过快,导致视觉上只能看到开始和结束位置,中间过程被跳过。虽然尝试添加了延迟函数,但并未从根本上解决回放平滑度的问题;



慢慢拖动小方块到一个新位置,然后松开鼠标,



先点击“复位”,再点击“回放”查看所经过的路径,


只有一次机会哦 - -|||


循环内延迟的部分代码:

代码如下:

 
//延迟方法
sleep: function(n) {
var start = new Date().getTime();
while (true)
if (new Date().getTime() - start > n)
break;
}, 
//回看轨迹记录
backTrack: function() {
var oSlippage = document.getElementById("slippage");
var len = this.X.length;
for (var i = 0; i < len; i++) {
oSlippage.style.left = this.X[i] - this.relativeX;
oSlippage.style.top = this.Y[i] - this.relativeY;
//延迟循环方法
this.sleep(10);
} 
} 

还是没有达到慢慢回放的效果,待解决。。。


啊哈,今早解决了~!


放弃for循环,改用定时器配合数组下标,不断改变小方块的left和top属性;



定时器结合数组下标

代码如下:

 
//延迟方法
sleep: function(n) {
//var start = new Date().getTime();
//while (true)
// if (new Date().getTime() - start > n)
// break;
var oSlippage = document.getElementById("slippage");
oSlippage.style.left = this.X[this.iNum] - this.relativeX; //iNum为数组下标
oSlippage.style.top = this.Y[this.iNum] - this.relativeY;
MOUSETRACKRECORD.iNum++;
//如果下标大于了他的长度就停止回放
if (this.iNum > this.X.length - 1) {
clearInterval(this.timeID);
} 
}, 
//回看轨迹记录
backTrack: function() {
//var oSlippage = document.getElementById("slippage");
//var len = this.X.length;
//for (var i = 0; i < len; i++) {
// oSlippage.style.left = this.X[i] - this.relativeX;
// oSlippage.style.top = this.Y[i] - this.relativeY;
// //延迟循环方法
// this.sleep(10);
//} 
this.timeID = setInterval("MOUSETRACKRECORD.sleep()", 10);
} 

演示效果:


 <div style="border-bottom: #000000 1px solid; position: relative; border-left: #000000 1px solid; width: 500px; height: 200px; border-top: #000000 1px solid; border-right: #000000 1px solid" id="map"> <div style="z-index: 99; position: absolute; background-color: #000000; width: 30px; height: 30px; top: 50px; cursor: move; left: 50px; background-origin: initial; background-clip: initial" id="slippage" onmouseup="MOUSETRACKRECORD.mouseUp();" onmousemove="MOUSETRACKRECORD.mouseMove();" onmousedown="MOUSETRACKRECORD.mouseDown();"></div></div><input id="Button1" onclick="MOUSETRACKRECORD.overTrack();" value="复位" type="button"> <input id="Button2" onclick="MOUSETRACKRECORD.backTrack();" value="回放" type="button"> <input id="Button3" onclick="MOUSETRACKRECORD.init();" value="再来一次" type="button"> 

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章