при наведении курсора срабатывает только один раз, когда курсор попадает на холст. Вы можете просто использовать событие mousemove и сравнить координаты. Вот пример, который заполняет при входе и очищает при выходе:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.rect(0, 0, 20, 20);
ctx.stroke();
function fill()
{
if(event.clientX <= 20 && event.clientY <= 20)
{
ctx.fill();
}else{
ctx.clearRect(0, 0, 20, 20);
}
console.log(event.clientX + " " + event.clientY);
}
c.addEventListener("mousemove", fill);
Вот jsfiddle в действии: https://jsfiddle.net/dL18v63w/