<style>
#signatureArea {
height: 100%;
background-color: #FFFFFF;
margin-bottom: 10px;
position: relative;
}
.sign-btn-box {
position: absolute;
right: 0;
bottom: 0;
padding: 10px;
}
</style>
<div id="signatureArea">
<div class="sign-btn-box">
<button id="clearButton">清除</button>
<button id="saveButton">保存签名</button>
</div>
</div>
<script type="text/javascript">
$(function () {
var signatureArea = document.getElementById('signatureArea');
var clearButton = document.getElementById('clearButton');
var saveButton = document.getElementById('saveButton');
var isDrawing = false;
var lastX, lastY;
var drawingCanvas = document.createElement('canvas');
var backgroundCanvas = document.createElement('canvas');
var drawingCtx = drawingCanvas.getContext('2d');
var backgroundCtx = backgroundCanvas.getContext('2d');
drawingCanvas.width = signatureArea.offsetWidth;
drawingCanvas.height = signatureArea.offsetHeight;
backgroundCanvas.width = drawingCanvas.width;
backgroundCanvas.height = drawingCanvas.height;
signatureArea.appendChild(drawingCanvas);
signatureArea.addEventListener('touchstart', startDrawing);
signatureArea.addEventListener('mousedown', startDrawingPC);
signatureArea.addEventListener('touchmove', draw);
signatureArea.addEventListener('mousemove', drawPC);
signatureArea.addEventListener('touchend', stopDrawing);
signatureArea.addEventListener('mouseup', stopDrawing);
clearButton.addEventListener('click', clearSignature);
saveButton.addEventListener('click', saveSignature);
function startDrawing(e) {
e.preventDefault();
let touch = e.touches[0];
let rect = signatureArea.getBoundingClientRect();
lastX = touch.clientX - rect.left;
lastY = touch.clientY - rect.top;
isDrawing = true;
}
function startDrawingPC(e) {
e.preventDefault();
let rect = signatureArea.getBoundingClientRect();
lastX = e.x - rect.left;
lastY = e.y - rect.top;
isDrawing = true;
}
function draw(e) {
if (!isDrawing) return;
let touch = e.touches[0];
let rect = signatureArea.getBoundingClientRect();
let x = touch.clientX - rect.left;
let y = touch.clientY - rect.top;
drawLine(lastX, lastY, x, y);
lastX = x;
lastY = y;
}
function drawPC(e) {
if (!isDrawing) return;
let rect = signatureArea.getBoundingClientRect();
let x = e.x - rect.left;
let y = e.y - rect.top;
drawLine(lastX, lastY, x, y);
lastX = x;
lastY = y;
}
function stopDrawing() {
isDrawing = false;
}
function drawLine(x1, y1, x2, y2) {
drawingCtx.beginPath();
drawingCtx.moveTo(x1, y1);
drawingCtx.lineTo(x2, y2);
drawingCtx.lineWidth = 1;
drawingCtx.strokeStyle = '#000';
drawingCtx.stroke();
}
function clearSignature() {
drawingCtx.clearRect(0, 0, drawingCanvas.width, drawingCanvas.height);
backgroundCtx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height);
}
function saveSignature() {
backgroundCtx.fillStyle = 'white';
backgroundCtx.fillRect(0, 0, backgroundCanvas.width, backgroundCanvas.height);
backgroundCtx.drawImage(drawingCanvas, 0, 0);
var dataURL = backgroundCanvas.toDataURL("image/png");
var link = document.createElement('a');
link.href = dataURL;
link.download = '签名.png';
if ("download" in link) {
link.style.display = "none";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
} else {
alert("无法直接保存到相册,请手动保存签名图片。");
}
}
function saveSignature() {
backgroundCtx.fillStyle = 'white';
backgroundCtx.fillRect(0, 0, backgroundCanvas.width, backgroundCanvas.height);
backgroundCtx.drawImage(drawingCanvas, 0, 0);
backgroundCanvas.toBlob((blob) => {
let file2 = new File([blob], 'sign.png', {type: 'image/png'})
let formData = new FormData()
formData.append('file', file2)
$.ajax({
url: '/',
type: 'POST',
processData: false,
contentType: false,
cache: false,
data: formData,
success(res) {
console.log("上传完成!")
}
})
});
}
function saveSignature() {
backgroundCtx.fillStyle = 'white';
backgroundCtx.fillRect(0, 0, backgroundCanvas.width, backgroundCanvas.height);
backgroundCtx.drawImage(drawingCanvas, 0, 0);
let base64 = backgroundCanvas.toDataURL("image/png");
let bstr = atob(base64.split(',')[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
let file2 = new File([u8arr], 'sign.png', {type: 'image/png'})
let formData = new FormData()
formData.append('file', file2)
$.ajax({
url: '/',
type: 'POST',
processData: false,
contentType: false,
cache: false,
data: formData,
success(res) {
console.log("上传完成!")
}
})
}
})
</script>