JavaScript实现鼠标轨迹记录与平滑回放功能
作者:木棉时间:2026-10-24 20:12:41浏览:276
本文介绍如何使用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需再刷新一下页面才能执行]
作者最新文章
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
为什么JS中typeof []返回object:数组类型检测误区解析
2026-11-04 19:50:47
