手写输入
2024-11-25 09:56:02
html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Signature Pad</title>
<style>
canvas {
border: 1px solid #000;
width: 100%;
max-width: 600px;
height: 300px;
}
button {
margin-top: 10px;
}
</style>
</head>
<body>
<h1>Signature Pad</h1>
<canvas id="signatureCanvas"></canvas>
<br>
<button id="clearButton">清除</button>
<button id="saveButton">保存</button>
<img id="savedImage" alt="Saved Signature" style="display:none;" />
<input type="hidden" name="qm" id="qm">
<script src="jquery-3.5.1.js"></script>
<script src="signature.js"></script>
</body>
</html>
js文件
// 获取Canvas元素和2D绘图上下文
const canvas = document.getElementById('signatureCanvas');
const ctx = canvas.getContext('2d');
// 设定Canvas尺寸
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;
// 初始化绘图状态
let drawing = false;
let lastX = 0;
let lastY = 0;
// 开始绘制
canvas.addEventListener('mousedown', (e) => {
drawing = true;
[lastX, lastY] = [e.offsetX, e.offsetY];
});
canvas.addEventListener('mousemove', (e) => {
if (!drawing) return;
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.lineTo(e.offsetX, e.offsetY);
ctx.stroke();
[lastX, lastY] = [e.offsetX, e.offsetY];
});
canvas.addEventListener('mouseup', () => drawing = false);
canvas.addEventListener('mouseout', () => drawing = false);
// 移动端支持
canvas.addEventListener('touchstart', (e) => {
drawing = true;
const touch = e.touches[0];
const rect = canvas.getBoundingClientRect();
[lastX, lastY] = [touch.clientX - rect.left, touch.clientY - rect.top];
});
canvas.addEventListener('touchmove', (e) => {
if (!drawing) return;
const touch = e.touches[0];
const rect = canvas.getBoundingClientRect();
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.lineTo(touch.clientX - rect.left, touch.clientY - rect.top);
ctx.stroke();
[lastX, lastY] = [touch.clientX - rect.left, touch.clientY - rect.top];
});
canvas.addEventListener('touchend', () => drawing = false);
// 清除Canvas
document.getElementById('clearButton').addEventListener('click', () => {
ctx.clearRect(0, 0, canvas.width, canvas.height);
});
// 保存签名为图片
document.getElementById('saveButton').addEventListener('click', () => {
const dataURL = canvas.toDataURL('image/png');
const img = document.getElementById('savedImage');
img.src = dataURL;
$("#qm").val(dataURL);
img.style.display = 'block';
});
上一篇:打印iframe 页面
- 祝贺!我国成功在海上发射一箭双星2022-10-07
- 曾被称作“世界第八奇迹”,富士康美国工厂为何黄了2022-10-14
- 10月10日0-14时,四川叙永县新增本土感染者154例2022-10-11
- 10月10日湖北新增本土无症状感染者29例2022-10-11
- 重磅利好之后,国庆楼市“战况”如何?2022-10-09
- 台媒曝:日本舰船骚扰台湾船只,双方对峙10小时2022-10-03
- 全国现有高中风险区1707+1139个,一图速览2022-10-12
- 从“盛夏”到“深秋”的转换 你准备好了吗2022-10-04
- 湖南长沙市在外省返长人员中发现6例无症状感染者2022-10-07
- 中国女篮获世界杯亚军,姚明强调“不能头脑发热”2022-10-04
- 午夜更新!全国现有高中风险区695+617个,一图速览2022-10-05
- 广东10月4日新增本土确诊34例、无症状感染者24例2022-10-05
- 10月6日7时至22时 海口实行临时性全域静态管理2022-10-06
- 北京10月5日新增本土确诊2例、无症状感染者2例2022-10-06
- 北京朝阳区新增2名新冠肺炎初筛阳性人员2022-10-09
- 二十大报告亮点纷呈 众多重要表述受关注2022-10-16
- 未来中国开放的大门只会越开越大2022-10-17