สร้างลายเซ็นอิเล็กทรอนิกส์ (Canvas Signature)
ตัวอย่างนี้สามารถทำงานได้ทั้งบนหน้าจอสัมผัส และบนเดสก์ท็อปด้วยเมาส์
มี 2 แบบ ให้ทดลองใช้
- แบบที่ 1 เป็นแบบพื้นฐาน
- แบบที่ 2 เป็นแบบไล่ระดับน้ำหนักเส้น

แบบที่ 1 พื้นฐาน
<!-- https://www.codeproject.com/Articles/355230/HTML-5-Canvas-A-Simple-Paint-Program-Touch-and-Mou --> | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="utf-8" /> | |
<title>Desktops and Tablets</title> | |
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> | |
<script type="text/javascript"> | |
$(document).ready(function () { | |
initialize(); | |
}); | |
// works out the X, Y position of the click inside the canvas from the X, Y position on the page | |
function getPosition(mouseEvent, sigCanvas) { | |
var x, y; | |
if (mouseEvent.pageX != undefined && mouseEvent.pageY != undefined) { | |
x = mouseEvent.pageX; | |
y = mouseEvent.pageY; | |
} else { | |
x = mouseEvent.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; | |
y = mouseEvent.clientY + document.body.scrollTop + document.documentElement.scrollTop; | |
} | |
return { X: x - sigCanvas.offsetLeft, Y: y - sigCanvas.offsetTop }; | |
} | |
function initialize() { | |
// get references to the canvas element as well as the 2D drawing context | |
var sigCanvas = document.getElementById("canvasSignature"); | |
var context = sigCanvas.getContext("2d"); | |
context.strokeStyle = 'Black'; | |
// This will be defined on a TOUCH device such as iPad or Android, etc. | |
var is_touch_device = 'ontouchstart' in document.documentElement; | |
if (is_touch_device) { | |
// create a drawer which tracks touch movements | |
var drawer = { | |
isDrawing: false, | |
touchstart: function (coors) { | |
context.beginPath(); | |
context.moveTo(coors.x, coors.y); | |
this.isDrawing = true; | |
}, | |
touchmove: function (coors) { | |
if (this.isDrawing) { | |
context.lineTo(coors.x, coors.y); | |
context.stroke(); | |
} | |
}, | |
touchend: function (coors) { | |
if (this.isDrawing) { | |
this.touchmove(coors); | |
this.isDrawing = false; | |
} | |
} | |
}; | |
// create a function to pass touch events and coordinates to drawer | |
function draw(event) { | |
// get the touch coordinates. Using the first touch in case of multi-touch | |
var coors = { | |
x: event.targetTouches[0].pageX, | |
y: event.targetTouches[0].pageY | |
}; | |
// Now we need to get the offset of the canvas location | |
var obj = sigCanvas; | |
if (obj.offsetParent) { | |
// Every time we find a new object, we add its offsetLeft and offsetTop to curleft and curtop. | |
do { | |
coors.x -= obj.offsetLeft; | |
coors.y -= obj.offsetTop; | |
} | |
// The while loop can be "while (obj = obj.offsetParent)" only, which does return null | |
// when null is passed back, but that creates a warning in some editors (i.e. VS2010). | |
while ((obj = obj.offsetParent) != null); | |
} | |
// pass the coordinates to the appropriate handler | |
drawer[event.type](coors); | |
} | |
// attach the touchstart, touchmove, touchend event listeners. | |
sigCanvas.addEventListener('touchstart', draw, false); | |
sigCanvas.addEventListener('touchmove', draw, false); | |
sigCanvas.addEventListener('touchend', draw, false); | |
// prevent elastic scrolling | |
sigCanvas.addEventListener('touchmove', function (event) { | |
event.preventDefault(); | |
}, false); | |
} | |
else { | |
// start drawing when the mousedown event fires, and attach handlers to | |
// draw a line to wherever the mouse moves to | |
$("#canvasSignature").mousedown(function (mouseEvent) { | |
var position = getPosition(mouseEvent, sigCanvas); | |
context.moveTo(position.X, position.Y); | |
context.beginPath(); | |
// attach event handlers | |
$(this).mousemove(function (mouseEvent) { | |
drawLine(mouseEvent, sigCanvas, context); | |
}).mouseup(function (mouseEvent) { | |
finishDrawing(mouseEvent, sigCanvas, context); | |
}).mouseout(function (mouseEvent) { | |
finishDrawing(mouseEvent, sigCanvas, context); | |
}); | |
}); | |
} | |
} | |
// draws a line to the x and y coordinates of the mouse event inside | |
// the specified element using the specified context | |
function drawLine(mouseEvent, sigCanvas, context) { | |
var position = getPosition(mouseEvent, sigCanvas); | |
context.lineTo(position.X, position.Y); | |
context.stroke(); | |
} | |
// draws a line from the last coordiantes in the path to the finishing | |
// coordinates and unbind any event handlers which need to be preceded | |
// by the mouse down event | |
function finishDrawing(mouseEvent, sigCanvas, context) { | |
// draw the line to the finishing coordinates | |
drawLine(mouseEvent, sigCanvas, context); | |
context.closePath(); | |
// unbind any events which could draw | |
$(sigCanvas).unbind("mousemove") | |
.unbind("mouseup") | |
.unbind("mouseout"); | |
} | |
</script> | |
</head> | |
<body> | |
<h1>Canvas test</h1> | |
<div id="canvasDiv"> | |
<!-- It's bad practice (to me) to put your CSS here. I'd recommend the use of a CSS file! --> | |
<canvas id="canvasSignature" width="500px" height="500px" style="border:2px solid #000000;"></canvas> | |
</div> | |
</body> | |
</html> |
แบบที่ 2 ไล่ระดับน้ำหนักเส้น
<!-- https://github.com/szimek/signature_pad --> | |
<!doctype html> | |
<html lang="en"> | |
<head> | |
<meta charset="utf-8"> | |
<title>Signature Pad demo</title> | |
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/signature_pad@4.0.7/docs/css/signature-pad.css"> | |
</head> | |
<body onselectstart="return false"> | |
<div id="signature-pad" class="signature-pad"> | |
<div class="signature-pad--body"> | |
<canvas></canvas> | |
</div> | |
<div class="signature-pad--footer"> | |
<div class="description">Sign above</div> | |
<div class="signature-pad--actions"> | |
<div> | |
<button type="button" class="button clear" data-action="clear">Clear</button> | |
<button type="button" class="button" data-action="change-color">Change color</button> | |
<button type="button" class="button" data-action="undo">Undo</button> | |
</div> | |
<div> | |
<button type="button" class="button save" data-action="save-png">Save as PNG</button> | |
<button type="button" class="button save" data-action="save-jpg">Save as JPG</button> | |
<button type="button" class="button save" data-action="save-svg">Save as SVG</button> | |
</div> | |
</div> | |
</div> | |
</div> | |
<script src="https://cdn.jsdelivr.net/npm/signature_pad@4.0.7/dist/signature_pad.umd.min.js"></script> | |
<script src="https://cdn.jsdelivr.net/npm/signature_pad@4.0.7/docs/js/app.js"></script> | |
</body> | |
</html> |
>>>TRY TO CHECK OUT , IF ANY ERROR FOUND. PLEASE LET ME KNOW BY COMMENT.
I'LL TRY MY LEVEL BEST TO FIX THE PROBLEM.
THANKS FOR VISITING thumariya.blogspot
Have a nice day!
-------------------------- -------------------------
>>>ลองตรวจสอบหากพบข้อผิดพลาด โปรดแจ้งให้เราทราบโดยแสดงความคิดเห็น
ฉันจะพยายามระดับของฉันให้ดีที่สุดเพื่อแก้ไขปัญหา
ขอบคุณสำหรับการเยี่ยมชม thumariya.blogspot
ขอให้เป็นวันที่ดี!
-------------------------- -------------------------
{fullWidth}