我为这个网站写了一个小绘图脚本(canvas):http://scri.ch/
当你点击文档时,每个 mousemove
事件基本上执行以下操作:
- 获取坐标。
- 在此点和前一个点之间使用 context.lineTo()
- context.stroke()
绘制线条。
正如您所看到的,如果您移动鼠标非常快,事件不会触发足够多次(取决于您的 CPU / 浏览器 / 等等),从而绘制一条直线。
伪代码如下:
window.addEventListener('mousemove', function(e){
myContext.lineTo(e.pageX, e.pageY);
myContext.stroke();
}, false);
这是一个已知的问题,现有解决方案是可以的,但我想优化它。
所以我不是每次鼠标移动时都调用stroke()
,而是将新坐标放入数组队列中,然后使用定时器定期绘制/清空该数组。
伪代码如下:
var coordsQueue = [];
window.addEventListener('mousemove', function(e){
coordsQueue.push([e.pageX, e.pageY]);
}, false);
function drawLoop(){
window.setTimeout(function(){
var coords;
while (coords = coordsQueue.shift()) {
myContext.lineTo(coords[0], coords[1]);
}
myContext.stroke();
drawLoop();
}, 1000); // For testing purposes
}
但是这并没有改善线条。所以我尝试只在mousemove
上绘制一个点。结果相同:点之间的间距太大了。
这让我意识到,第一个代码块已经足够高效了,只是mousemove
事件触发得太慢了。
因此,在我自己花费了一些时间实现一个无用的优化之后,轮到你了:是否有一种方法可以优化DOM脚本中mousemove
的触发速度?
是否可能随时“请求”鼠标位置?
感谢您的建议!