当前位置:首页 > JavaScript

js 实现签名

2026-03-13 17:25:20JavaScript

使用原生 JavaScript 实现签名

在 JavaScript 中实现签名功能通常涉及绘制签名到画布(Canvas)并保存为图像数据。以下是一个基础实现示例:

// 获取 Canvas 元素和上下文
const canvas = document.getElementById('signatureCanvas');
const ctx = canvas.getContext('2d');
let isDrawing = false;

// 鼠标/触摸事件监听
canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', endDrawing);
canvas.addEventListener('mouseout', endDrawing);

// 触摸设备支持
canvas.addEventListener('touchstart', handleTouch);
canvas.addEventListener('touchmove', handleTouch);
canvas.addEventListener('touchend', endDrawing);

function startDrawing(e) {
    isDrawing = true;
    draw(e);
}

function draw(e) {
    if (!isDrawing) return;
    const rect = canvas.getBoundingClientRect();
    const x = (e.clientX || e.touches[0].clientX) - rect.left;
    const y = (e.clientY || e.touches[0].clientY) - rect.top;

    ctx.lineWidth = 2;
    ctx.lineCap = 'round';
    ctx.strokeStyle = '#000';
    ctx.lineTo(x, y);
    ctx.stroke();
    ctx.beginPath();
    ctx.moveTo(x, y);
}

function endDrawing() {
    isDrawing = false;
    ctx.beginPath();
}

function handleTouch(e) {
    e.preventDefault();
    const touch = e.touches[0];
    const mouseEvent = new MouseEvent(
        e.type === 'touchstart' ? 'mousedown' : 'mousemove',
        { clientX: touch.clientX, clientY: touch.clientY }
    );
    canvas.dispatchEvent(mouseEvent);
}

// 保存签名为图像
function saveSignature() {
    const imageData = canvas.toDataURL('image/png');
    console.log(imageData); // 可上传至服务器或保存
}

// 清除签名
function clearSignature() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

使用第三方库简化实现

对于更复杂的需求,可以使用现成的签名库如 Signature Pad

  1. 安装库:

    npm install signature_pad
  2. 实现代码:

    
    import SignaturePad from 'signature_pad';

const canvas = document.getElementById('signatureCanvas'); const signaturePad = new SignaturePad(canvas);

// 调整线条样式 signaturePad.penColor = 'rgb(0, 0, 0)'; signaturePad.minWidth = 1; signaturePad.maxWidth = 3;

// 保存签名 function saveSignature() { if (signaturePad.isEmpty()) { alert('请先签名'); return; } const dataURL = signaturePad.toDataURL(); // PNG格式 console.log(dataURL); }

// 清除签名 function clearSignature() { signaturePad.clear(); }

js 实现签名


### 服务端签名验证(示例)

如需将签名发送至服务端验证(如 Node.js + Express):

```javascript
const express = require('express');
const app = express();
app.use(express.json());

app.post('/verify-signature', (req, res) => {
    const { signatureData } = req.body;
    // 此处可添加验证逻辑(如图像分析)
    res.json({ valid: true });
});

app.listen(3000);

关键注意事项

  • 响应式设计:在窗口大小变化时需调用 signaturePad.fromDataURL() 重新渲染签名。
  • 高清输出:通过 canvas.width = canvas.offsetWidth * 2 提升分辨率。
  • 数据格式toDataURL('image/jpeg') 可减少图像体积。

以上方法覆盖了从基础实现到生产级应用的签名功能需求。

标签: js
分享给朋友:

相关文章

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…