其他一些答案表明这是因为处理程序功能缓慢。count++
在我的测试中,无论我只是在处理程序中还是在更昂贵的画布绘制调用中都没有任何区别——在这两种情况下,10 秒内生成的事件数量约为 500。但是,它可能在较慢的计算机上有所作为。
显然,大多数鼠标/指针每秒向操作系统报告其位置的次数少于 100 次,因此这可能甚至不在浏览器的控制范围内。
您可能想研究新PointerEvent.getCoalescedEvents()
方法。来自 MDN 文档:
接口的getCoalescedEvents()
方法返回合并到调度事件PointerEvent
中的所有实例的序列。PointerEvent
pointermove
这是一个例子:
window.addEventListener("pointermove", function(event) {
let events = event.getCoalescedEvents();
for(let e of events) {
draw(e.pageX, e.pageY);
}
});
然而,在测试之后,它似乎很少合并我电脑上的事件。不过,同样,它在速度较慢的计算机上可能更有用。因此,目前最好的方法可能是使用ctx.lineTo
,或类似的方法(arcTo
也许)。这是一个简单的工作画布绘图演示,它结合getCoalescedEvents
了lineTo
:
<canvas id="canvas" style="touch-action:none; width:100vw; height:100vh; position:fixed; top:0; left:0; right:0; bottom:0;"></canvas>
<script>
let mouseIsDown = false;
let ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
window.addEventListener("pointerdown", function(e) {
ctx.beginPath();
ctx.moveTo(e.pageX, e.pageY);
mouseIsDown = true;
});
window.addEventListener("pointerup", function(e) {
mouseIsDown = false;
});
window.addEventListener("pointermove", function(event) {
if(mouseIsDown) {
let events = event.getCoalescedEvents();
for(let e of events) {
ctx.lineTo(e.pageX, e.pageY);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(e.pageX, e.pageY);
}
}
});
</script>