The problem lines are in the bottom.
<!DOCTYPE html>
<html ><head><meta charset='utf-8'/>
<style type="text/css"><!-- #containerID { position: relative; } #canvasID { border: 1px solid #000; } #imageTemp { position: absolute; top: 1px; left: 11px; } --></style>
<div id="containerID" style="touch-action:none; width: 100px; height: 500px; overflow: auto;">
<canvas id='canvasID' width='80' height='80' style='margin-left:10px;background:white;border:solid black 1px; touch-action:none; '>
Your browser does not support canvas element.
</canvas>
</div>
<script type='text/javascript'>
var el = document.getElementById("canvasID");
var elcontainer = document.getElementById("containerID");
var ctx = el.getContext('2d');
var startpuntX, startpuntY, eindpuntX, eindpuntY;
var startDrawing = false;
var container = el.parentNode; // Add the temporary canvas.
var containerHandletje = document.getElementById('containerID');
var ongoingTouches = new Array();
var huidigeKleur = 'black';
var huidigeDikte = 2;
var selectie = document.getElementById('drawingtoolID');
elcontainer.setAttribute("style", 'width: '+(window.innerWidth-12)+'px; height: '+(window.innerHeight-80)+'px; overflow: auto;');
el.height = window.innerHeight-90;
el.width = window.innerWidth-42;
canvaslayer = document.createElement('canvas');
canvaslayer.id = 'imageTemp';
canvaslayer.width = el.width;
canvaslayer.height = el.height;
canvaslayer.style = 'touch-action:none;';
container.appendChild(canvaslayer);
ctxlayer = canvaslayer.getContext('2d');
ctxlayer.lineCap = 'round';
ctx.lineWidth = 1;
ctx.lineJoin = 'round';
ctx.lineCap = 'round';
ctx.fillStyle = 'white'
ctx.fillRect(0, 0, el.width, el.height);
ctx.lineWidth = huidigeDikte;
canvaslayer.removeEventListener('pointerdown', handleStart, false);
canvaslayer.removeEventListener('pointerup', handleEnd, false);
canvaslayer.removeEventListener('pointercancel', handleCancel, false);
canvaslayer.removeEventListener('pointermove', handleMove, false);
canvaslayer.addEventListener('pointerdown', handleLineStart, false);
canvaslayer.addEventListener('pointerup', handleLineEnd, false);
canvaslayer.addEventListener('pointermove', handleLineMove, false);
function handleStart(evt) {
ongoingTouches.push(copyTouch(evt));
ctx.beginPath();
ctx.moveTo(evt.clientX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft, evt.clientY - 0.1 - container.offsetTop + pageYOffset + containerHandletje.scrollTop);
ctx.lineTo(evt.clientX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft, evt.clientY - container.offsetTop + pageYOffset + containerHandletje.scrollTop);
ctx.stroke();
}
function handleMove(evt) {
var idx = ongoingTouchIndexById(evt.pointerId);
if (idx >= 0) {
ctx.beginPath();
ctx.moveTo(ongoingTouches[idx].pageX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft, ongoingTouches[idx].pageY - container.offsetTop+pageYOffset + containerHandletje.scrollTop);
ctx.lineTo(evt.clientX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft, evt.clientY - container.offsetTop+pageYOffset + containerHandletje.scrollTop);
ctx.stroke();
ongoingTouches.splice(idx, 1, copyTouch(evt)); // swap in the new touch record
}
}
function handleEnd(evt) {
var idx = ongoingTouchIndexById(evt.pointerId);
if (idx >= 0) {
ctx.beginPath();
ctx.moveTo(ongoingTouches[idx].pageX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft, ongoingTouches[idx].pageY - container.offsetTop + pageYOffset);
ctx.lineTo(evt.clientX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft, evt.clientY - container.offsetTop + pageYOffset + containerHandletje.scrollTop);
ongoingTouches.splice(idx, 1); // remove it; we're done
}
}
function handleCancel(evt) {
alert('BOE-CANCEL');
var idx = ongoingTouchIndexById(evt.pointerId);
ongoingTouches.splice(idx, 1); // remove it; we're done
}
function copyTouch(touch) {
return { identifier: touch.pointerId, pageX: touch.clientX, pageY: touch.clientY };
}
function ongoingTouchIndexById(idToFind) {
for (var i = 0; i < ongoingTouches.length; i++) {
var id = ongoingTouches[i].identifier;
if (id == idToFind) { return i; }
}
return -1;
}
function handleLineStart(evt)
{
startpuntX = evt.clientX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft;
startpuntY = evt.clientY - container.offsetTop + pageYOffset + containerHandletje.scrollTop;
ctxlayer.lineWidth = huidigeDikte;
ctxlayer.strokeStyle = huidigeKleur;
ctxlayer.fillStyle = huidigeKleur;
startDrawing = true;
ctxlayer.stroke();
ctxlayer.beginPath();
handleLineMove(evt);
}
function handleLineMove(evt)
{
var x,y,w,h,hokDx,xi,yi,asX,asY,asXeind,asYeind,fontsize,dzx,dzy,situatie;
if (startDrawing)
{
eindpuntX = evt.clientX - el.offsetLeft + pageXOffset + containerHandletje.scrollLeft;
eindpuntY = evt.clientY - container.offsetTop + pageYOffset + containerHandletje.scrollTop;
ctxlayer.clearRect(0, 0, el.width, el.height);
ctxlayer.beginPath();
ctxlayer.moveTo(startpuntX,startpuntY);
x = Math.min(startpuntX, eindpuntX);
y = Math.min(startpuntY, eindpuntY);
w = Math.abs(startpuntX - eindpuntX);
h = Math.abs(startpuntY - eindpuntY);
ctxlayer.strokeRect(x,y,w,h);
ctxlayer.stroke();
ctxlayer.beginPath();
}
}
function handleLineEnd(evt)
{
{
startDrawing = false;
var dummy = ctx.getImageData(3,3,5,5); // problem line
var dummy = ctx.getImageData(3,3,5,5); // problem line
ctx.drawImage(canvaslayer, 0, 0);
ctxlayer.clearRect(0, 0, el.width, el.height);
}
}
</script>
</body></html>
I ripped off all the lines not necessary to show the problem.
Without the two lines: I can draw multiple rectangles on the ctx
With the two lines: Each rectangle is overwritten by the next rectangle.
There are no more details. But It seems necessary to write more lines because I have too much code in my question.