web 前端签名插件_signature_pad插件实现电子签名功能
其实针对普通电子签名的话,直接下载这个插件打开里面的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插件实现电子签名功能相关推荐
- web 前端签名插件_手写签名插件—jSignature
jSignature 是一个通过捕捉笔画的矢量轮廓输出多种格式数据的jQuery插件,通过该插件我们可以实现绘画板.手写签名等功能. 使用该插件需要引入 jQuery 和jSignature.js,首 ...
- web前端之JavaScript的插件下载指令及介绍、npm、install、save、require
目录 1.扁平结构数据与树形结构数据之间的转换 2.防抖与节流 3.浮点数的加减乘除 4.检测输入的数据格式和类型是否正确,是否存在空数组或空对象 5.重名自增 6.根据后缀名渲染对应图标 1.扁平结 ...
- web 前端签名插件_匠心打造canvas签名组件
本文首发于CSDN网站,下面的版本又经过进一步的修订. 原文:匠心打造canvas签名组件 导读 6月又是项目吃紧的时候,一大波需求袭来,猝不及防. 度过了漫长而煎熬的6月,是时候总结一波.最近移动端 ...
- Html一修改就会自动刷新,web 前端修改 自动刷新 插件使用 liveReload
浏览器 Firefox,插件 liveReload: 1.打开 Firefox 浏览器, 2.选择附加组件,然后查看更多附加组件: 3.搜索 liveReload : 4.添加组件到Firefox 重 ...
- web前端 | 博客(二)登录功能
实现登录功能 创建用户集合,初始化用户 连接数据库 创建用户集合 初始化用户 为登录表单项设置请求地址,请求方式(GET方法会将参数放到地址栏中,不隐蔽,要用POST方法,它将参数放到消息体中,比较隐 ...
- web前端学习--仿QQ空间留言板功能
主要技术要点: css:利用position属性和margin属性实现基本布局. jq/js:留言板功能使用prepend实现最新的留言在顶部显示. 其中易出错的地方已经在源代码中有注释了,欢迎大家批 ...
- 防止首网页篡改 html,网站web前端的加密方式 防止数据被篡改
说到网络前端开发,我们首先可以想到的是浏览器.HTML.CSS.JavaScript等开发中必不可少的软件工具和编程语言.在这个专业领域,作为开发人员,我们都知道前端的所有数据都是不可信的.因为构成前 ...
- 几款常用的高质量Web前端框架!
近年来,Web前端技术的发展速度快得让人窒息,特别是最近几年一代又一代的变革一次又一次的创造.各大巨头又纷纷把技术转向HTML5和CSS3,各种企业级框架如雨后春笋般涌现. 那么今天就给大家介绍几个在 ...
- 2018最新的web前端开发框架排行总结
如果你是一个前端开发人员,当你在开发新项目时,想必一定被人问过"你用的是什么框架?"进而开展各种前端技术话题.但是对于初入门的前端小白来说,遇到这样的问题估计会产生一系列的疑问&q ...
最新文章
- LSGO:祝大家新年快乐!
- Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容
- Bayesian Neural Network for regression (PRML)
- 神经网络收敛标准与准确率之间的数学关系
- DrawerLayout侧滑
- AI现状 人才短缺成为障碍
- python写的一个贴吧爬虫_Python-简单百度贴吧爬虫
- Nova计算节点安装配置
- 社会计算机比赛,哈尔滨工业大学社会计算与信息检索研究中心 – 理解语言,认知社会 » IR-Lab参加计算机学院“光熙杯”篮球赛...
- 交换两个变量的值,不使用第三个变量的四种方法
- Docker引擎客户端工具docker的总结
- java hibernate 包_hibernatejar包官方下载-Hibernate.jar包下载 --pc6下载站
- 微信小程序之登录界面示例
- 附加SQL Server MDF文件的不同方法
- 计算机函数sumif求平均值,EXCEL的经典函数sumif的用法和实例(详细汇总)_excel函数_office之家...
- 02虚幻编辑器各部分功能详解
- 方舟win10自建服务器,win10电脑玩方舟生存进化常见问题汇总
- 方法重写的 两同 两小 一大
- 论字母导航的重要性,我们来实现一个联系人字母导航列表吧!
- 小米从北京迁往武汉南京,一线大厂逃离或为新常态?