Some other answers suggested that it's because of a slow handler function. In my tests it didn't make any difference whether I just had count++
in the handler, or much more expensive canvas draw calls - the number of events generated in 10 seconds was about 500 in both cases. However, it might have made a difference on a slower computer.
Apparently most mice/pointers only report their position to the OS fewer than 100 times per second, so this may be something that's not even in the browser's control.
You may want to look into the new PointerEvent.getCoalescedEvents()
method. From the MDN docs:
The getCoalescedEvents()
method of the PointerEvent
interface returns a sequence of all PointerEvent
instances that were coalesced into the dispatched pointermove
event.
Here's an example:
window.addEventListener("pointermove", function(event) {
let events = event.getCoalescedEvents();
for(let e of events) {
draw(e.pageX, e.pageY);
}
});
However, after testing this, it only rarely seems to coalesce the events on my computer. Again, though, it may be more useful on slower computers. So for now the best approach is probably to use ctx.lineTo
, or a similar method (arcTo
, perhaps). Here's a simple working canvas drawing demo that combines getCoalescedEvents
with 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>