手写输入
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 页面
- 10月10日0-14时,四川叙永县新增本土感染者154例2022-10-11
- 国家卫健委:要坚决整治“层层加码”2022-10-13
- 31省区市新增本土“182+534”2022-10-17
- 新疆:核酸检测成为防控工作中的最大短板2022-10-04
- 又一座千万人口城市诞生,为什么是济南2022-10-13
- 新疆10月8日新增本土感染者“53+383”2022-10-09
- 格力海尔们入局预制菜市场,家电巨头们看中的是什么2022-10-16
- 10月6日7时至22时 海口实行临时性全域静态管理2022-10-06
- 31省区市新增本土“208+587”2022-10-18
- 广东东莞新增2例无症状感染者,详情公布2022-10-03
- 午夜更新!全国现有高中风险区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
