其实针对普通电子签名的话,直接下载这个插件打开里面的docs文件引入js,css和index直接运行就是一个电子签名面板了,很实用,功能和性能都是比较好的,插件地址szimek/signature_pad

还有其中有个app.js文件也需要引入,如果不引入里面的功能都用不了,主要是几个按钮的方法,如果不需要的可以删除。

css样式中 .signature-pad这个类名的flex-direction值要改成默认的才能让按钮和画框同行显示,这个地方一般调试就看的到,但是还是想提醒一下。我做的是移动端的电子签名功能,同行显示是为了让页面看起来是横屏显示,所以按钮用了css3中的动画旋转效果。

.signature-pad {

max-height: 570px !important;

flex-direction: initial;

}

.signature-pad--body {

width: 80%;

}

.signature-pad--footer {

width: 10%;

}

.signature-pad--body, .signature-pad--footer {

display: inline !important;

}

button {

transform-origin: 15% 90%;

transform: rotate(90deg);

margin-top: 85px;

width: 100px;

border: none;

background-color: dodgerblue;

color: #fff;

padding: 6px;

}

//页面的HTML布局,因为插件是基于js的,所以里面的方法如果是用vue包着那么方法就会失效,但是在数据面前我又需要用到vue和它的一个vant框架,这里有做个了奇葩的事,在整个电子签名的结构下写一个div然后vue在里面代码在里面操作,不知道这样是不是不对的。

清除

回退

保存

剩下的就是js代码了,所以直接先引入signature_pad.umd.js文件,然后把app.js中的代码取了处出来,直接显示在页面中:

var wrapper = document.getElementById("signature-pad");

var clearButton = wrapper.querySelector("[data-action=clear]");

var changeColorButton = wrapper.querySelector("[data-action=change-color]");

var undoButton = wrapper.querySelector("[data-action=undo]");

var savePNGButton = wrapper.querySelector("[data-action=save-png]");

var saveJPGButton = wrapper.querySelector("[data-action=save-jpg]");

var saveSVGButton = wrapper.querySelector("[data-action=save-svg]");

var canvas = wrapper.querySelector("canvas");

var signaturePad = new SignaturePad(canvas, {

backgroundColor: 'rgb(255, 255, 255)'

});

function resizeCanvas() {

var ratio = Math.max(window.devicePixelRatio || 1, 1);

canvas.width = canvas.offsetWidth * ratio;

canvas.height = canvas.offsetHeight * ratio;

canvas.getContext("2d").scale(ratio, ratio);

signaturePad.clear();

}

window.onresize = resizeCanvas;

resizeCanvas();

function download(dataURL, filename) {

if (navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1) {

} else {

var blob = dataURLToBlob(dataURL);

var url = window.URL.createObjectURL(blob);

var a = document.createElement("a");

a.style = "display: none";

a.href = url;

a.download = filename;

document.body.appendChild(a);

window.URL.revokeObjectURL(url);

}

}

function dataURLToBlob(dataURL) {

var parts = dataURL.split(';base64,');

var contentType = parts[0].split(":")[1];

var raw = window.atob(parts[1]);

var rawLength = raw.length;

var uInt8Array = new Uint8Array(rawLength);

for (var i = 0; i < rawLength; ++i) {

uInt8Array[i] = raw.charCodeAt(i);

}

return new Blob([uInt8Array], { type: contentType });

}

clearButton.addEventListener("click", function (event) {

signaturePad.clear();

});

undoButton.addEventListener("click", function (event) {

var data = signaturePad.toData();

if (data) {

data.pop(); // remove the last dot or line

signaturePad.fromData(data);

}

});

//这里调用的是保存png图片的功能,所以要在这里面调用接口方法,dataURl是转换好了的base64字符格式的,直接传到方法中

savePNGButton.addEventListener("click", function (event) {

if (signaturePad.isEmpty()) {

alert("Please provide a signature first.");

} else {

var dataURL = signaturePad.toDataURL();

vm.upload(dataURL);

}

});

//imageStr64:图片数据,ImageName:图片名称,filePng:文件后缀名,如:png,imagePurpose:是上传签名还是图片

var vm = new Vue({

el: "#app",

data: {

imageStr64: '',

imageName: '',

disabled: false

},

methods: {

upload: function (dataURL) {

this.$toast.loading({

mask: true,

duration: 0,

message: '提交中...'

});

var _this = this;

var quality = 0.3; //压缩图片的质量

var canvas = document.createElement("canvas"); //创建画布

var ctx = canvas.getContext("2d");

var img = new Image();

img.src = dataURL;

var width = img.width;

var height = img.height;

canvas.width = 65; //这里可以自定义图片大小

canvas.height = 60;

ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

var cdata = canvas.toDataURL(); //将图片转为Base64

this.imageStr64 = cdata.split(',')[1];

this.imageName = new Date().getTime();

axios.post('/cil/OA/OA_WorkBench_ImageUpload', {

"ImageStr64": this.imageStr64,

"ImageName": this.imageName,

"Filenameextension": 'png',

"ImagePurpose": '上传签名'

}).then(function (res) {

var resData = JSON.parse(res.request.responseText).Message;

for (var i = 0; i < document.getElementsByTagName('button').length; i++) {

document.getElementsByTagName('button')[i].disabled = true;

document.getElementsByTagName('button')[i].style.backgroundColor = '#909090';

}

_this.$toast(resData);

}).catch(function (error) {

var errData = JSON.parse(error.request.responseText).Message;

_this.$toast(errData);

});

}

}

})

这样就做好一个移动端电子签名了,其实在插件上使用还是很好用的,只是在需要在别人插件上添加自己的需求比较麻烦,像这个功能的实现主要是在生成画布后上传图片要设置图片的大小,实现统一宽高的上传,然后压缩整个base64文件就好了。

有什么问题的话请多多指教。

web 前端签名插件_signature_pad插件实现电子签名功能相关推荐

  1. web 前端签名插件_手写签名插件—jSignature

    jSignature 是一个通过捕捉笔画的矢量轮廓输出多种格式数据的jQuery插件,通过该插件我们可以实现绘画板.手写签名等功能. 使用该插件需要引入 jQuery 和jSignature.js,首 ...

  2. web前端之JavaScript的插件下载指令及介绍、npm、install、save、require

    目录 1.扁平结构数据与树形结构数据之间的转换 2.防抖与节流 3.浮点数的加减乘除 4.检测输入的数据格式和类型是否正确,是否存在空数组或空对象 5.重名自增 6.根据后缀名渲染对应图标 1.扁平结 ...

  3. web 前端签名插件_匠心打造canvas签名组件

    本文首发于CSDN网站,下面的版本又经过进一步的修订. 原文:匠心打造canvas签名组件 导读 6月又是项目吃紧的时候,一大波需求袭来,猝不及防. 度过了漫长而煎熬的6月,是时候总结一波.最近移动端 ...

  4. Html一修改就会自动刷新,web 前端修改 自动刷新 插件使用 liveReload

    浏览器 Firefox,插件 liveReload: 1.打开 Firefox 浏览器, 2.选择附加组件,然后查看更多附加组件: 3.搜索 liveReload : 4.添加组件到Firefox 重 ...

  5. web前端 | 博客(二)登录功能

    实现登录功能 创建用户集合,初始化用户 连接数据库 创建用户集合 初始化用户 为登录表单项设置请求地址,请求方式(GET方法会将参数放到地址栏中,不隐蔽,要用POST方法,它将参数放到消息体中,比较隐 ...

  6. web前端学习--仿QQ空间留言板功能

    主要技术要点: css:利用position属性和margin属性实现基本布局. jq/js:留言板功能使用prepend实现最新的留言在顶部显示. 其中易出错的地方已经在源代码中有注释了,欢迎大家批 ...

  7. 防止首网页篡改 html,网站web前端的加密方式 防止数据被篡改

    说到网络前端开发,我们首先可以想到的是浏览器.HTML.CSS.JavaScript等开发中必不可少的软件工具和编程语言.在这个专业领域,作为开发人员,我们都知道前端的所有数据都是不可信的.因为构成前 ...

  8. 几款常用的高质量Web前端框架!

    近年来,Web前端技术的发展速度快得让人窒息,特别是最近几年一代又一代的变革一次又一次的创造.各大巨头又纷纷把技术转向HTML5和CSS3,各种企业级框架如雨后春笋般涌现. 那么今天就给大家介绍几个在 ...

  9. 2018最新的web前端开发框架排行总结

    如果你是一个前端开发人员,当你在开发新项目时,想必一定被人问过"你用的是什么框架?"进而开展各种前端技术话题.但是对于初入门的前端小白来说,遇到这样的问题估计会产生一系列的疑问&q ...

最新文章

  1. LSGO:祝大家新年快乐!
  2. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容
  3. Bayesian Neural Network for regression (PRML)
  4. 神经网络收敛标准与准确率之间的数学关系
  5. DrawerLayout侧滑
  6. AI现状 人才短缺成为障碍
  7. python写的一个贴吧爬虫_Python-简单百度贴吧爬虫
  8. Nova计算节点安装配置
  9. 社会计算机比赛,哈尔滨工业大学社会计算与信息检索研究中心 – 理解语言,认知社会 » IR-Lab参加计算机学院“光熙杯”篮球赛...
  10. 交换两个变量的值,不使用第三个变量的四种方法
  11. Docker引擎客户端工具docker的总结
  12. java hibernate 包_hibernatejar包官方下载-Hibernate.jar包下载 --pc6下载站
  13. 微信小程序之登录界面示例
  14. 附加SQL Server MDF文件的不同方法
  15. 计算机函数sumif求平均值,EXCEL的经典函数sumif的用法和实例(详细汇总)_excel函数_office之家...
  16. 02虚幻编辑器各部分功能详解
  17. 方舟win10自建服务器,win10电脑玩方舟生存进化常见问题汇总
  18. 方法重写的 两同 两小 一大
  19. 论字母导航的重要性,我们来实现一个联系人字母导航列表吧!
  20. 小米从北京迁往武汉南京,一线大厂逃离或为新常态?

热门文章

  1. 中国联通物联网平台能力介绍
  2. 详解:大数据分析的学习之路
  3. WEB漏洞之:海洋CMS代码执行(CNVD-2020-22721)
  4. 如何成为全栈工程师?
  5. YouCompleteMe + Ale异步检测语法
  6. k8s核心资源之service四层负载均衡器代理(六)
  7. 华为分布式存储FusionStorage知识点总结【面试篇】
  8. AirFlow的Scheduling的start_date解释
  9. springboot集成graphql(一)
  10. 最近美团前端面试题目整理