Мне нужен холст HTML, который отображает положение мыши в сетке JS при перемещении мыши, но я не могу очистить свой холст, я попытался использовать ctx.clearRect(0,0 canvas.width, canvas.height) и очистить с помощью клик, но он каким-то образом помнит предыдущий розыгрыш, который у него был. Я хочу, чтобы на холсте отображался только один черный квадрат за раз в зависимости от положения мыши. Вот демо на кодовой ручке и немного кода
<canvas id = "myMap" style = "width: 300px;height: 300px;background-color: beige;"></canvas>
<script>
var findDivisible = (x, scale) => {
while (x % scale !== 0 && x > 0) {
x = x - 1;
};
return x
};
var map = document.getElementById("myMap");
map.width = 300;
map.height = 300;
var mapContext = document.getElementById("myMap").getContext("2d");
map.addEventListener("mousemove", function(e) {
mapContext.clearRect(0, 0, map.width, map.height);
mapContext.rect(findDivisible(e.clientX - map.offsetLeft, 50), findDivisible(e.pageY - map.offsetTop, 50), 50, 50);
mapContext.stroke();
});
map.addEventListener("click", function() {
mapContext.clearRect(0, 0, 500, 500);
})
</script>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не начинаете новую обводку для каждого прямоугольника, а «складываете их», чтобы они перерисовывались с помощью .stroke().
Используйте .beginPath():
function findDivisible(x, scale) {
while (x % scale !== 0 && x > 0) {
x = x - 1;
}
return x;
}
var map = document.getElementById("myMap");
map.width = 300;
map.height = 300;
var mapContext = map.getContext("2d");
map.addEventListener("mousemove", function(e) {
mapContext.clearRect(0, 0, map.width, map.height);
mapContext.beginPath();
mapContext.rect(
findDivisible(e.clientX - map.offsetLeft, 50),
findDivisible(e.pageY - map.offsetTop, 50),
50,
50,
);
mapContext.stroke();
});
map.addEventListener("click", function() {
mapContext.clearRect(0, 0, 500, 500);
});<canvas id = "myMap" style = "width: 300px;height: 300px;background-color: beige;"></canvas>Вы можете попробовать это:
map.addEventListener("mousemove", function(e){
map.width = map.width;
mapContext.rect(findDivisible(e.clientX-map.offsetLeft,50) , findDivisible(e.pageY - map.offsetTop,50), 50, 50);
mapContext.stroke();
});
map.addEventListener("click", function(){
map.width = map.width;
});
One of the ways that is implicitly endorsed in the spec and often used in people’s apps to clear a canvas https://dzone.com/articles/how-you-clear-your-html5
@DBS и все же, это было бы. Это сбрасывает весь контекст, включая текущее объявление подпути вместе с все устанавливаемыми параметрами контекста и его базовыми ImageData (т.е. много мусора для сбора). Вот почему никогда не следует использовать этот хак.
Если
ctx.clearRectне работает, маловероятно, что старый метод выполнения того же действия (переустановка ширины) будет иметь какое-либо значение.