网站首页 > 技术文章 正文
新项目有一个需求:客户需要在订单确认的时候签名。
第一反应就是用html的canvas实现,同事一起商量了下,canvas有三个制约:
- canvas必须要用鼠标,签名会很难看;
- 手机端web app怎么实现签名?
- 签名好的canvas怎么作为图片提交到服务器?
纠结了一天,研究了下canvas,终于有了点眉目。先看看实际效果
手机端的不好截图,下面有源码可以下载。下面是源码截图(懒到一定程度了,截图吧^_^),代码都有注释,我相信读者花点时间肯定能看明白。
下面是app.js源码(太长了,不能截图了。。~~~~(>_<)~~~~)
//动态设置canvas的大小
function resizeCanvas {
$('#drawer').attr("width", $('.panel-body').width);
if(!$('.panel-body').height){
$('#drawer').attr("height", $('.panel-body').height);
}else{
$('#drawer').attr("height", 300);
}
};
var canvas,board;
canvas = document.getElementById('drawer');
board = canvas.getContext('2d');
var mousePress = false;
var last = null;
//开始绘制
function beginDraw{
mousePress = true;
}
//绘制
function drawing(event){
event.preventDefault;
if(!mousePress)return;
var xy = pos(event);
if(last!=null){
board.beginPath;
board.moveTo(last.x,last.y);
board.lineTo(xy.x,xy.y);
board.stroke;
}
last = xy;
}
//结束绘制
function endDraw(event){
mousePress = false;
event.preventDefault;
last = null;
}
//获取位置
function pos(event){
var x,y;
if(isTouch(event)){
x = event.touches[0].pageX-event.target.offsetLeft;
y = event.touches[0].pageY-event.target.offsetTop;
}else{
x = event.offsetX;
y = event.offsetY;
}
return {x:x,y:y};
}
//检测是touch还是mouse事件
function isTouch(event){
var type = event.type;
if(type.indexOf('touch')>=0){
return true;
}else{
return false;
}
}
//清除轨迹
function clearArea {
board.setTransform(1, 0, 0, 1, 0, 0);
board.clearRect(0, 0, board.canvas.width, board.canvas.height);
}
//转换成图片显示
function convertCanvasToImage {
var image = canvas.toDataURL("image/png");
$('#image').html("<img src='"+image+"' alt='from canvas'/>");
}
//生成图片并上传到服务器
function UploadPic {
var Pic = canvas.toDataURL("image/png");
Pic = Pic.replace(/^data:image\/(png|jpg);base64,/, "")
$.ajax({
type: 'POST',
url: 'url',
data: '{ "imageData" : "' + Pic + '" }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (msg) {
console.log("图片上传成功");
},
error: function(msg) {
alert("需要服务器资源");
}
});
}
board.lineWidth = 2;
board.strokeStyle="#000";
board.lineJoin = "round";
canvas.onmousedown = beginDraw;
canvas.onmousemove = drawing;
canvas.onmouseup = endDraw;
canvas.addEventListener('touchstart',beginDraw,false);
canvas.addEventListener('touchmove',drawing,false);
canvas.addEventListener('touchend',endDraw,false);ok,结束,下班~~
源码地址:canvas.rar
猜你喜欢
- 2024-09-10 Python奇淫技巧之自动登录哔哩哔哩(解决滑块验证)
- 2024-09-10 html转image 保存到zip(html保存成图片)
- 2024-09-10 前端上传图片被旋转的处理方案(nba常规赛录像高清回放)
- 2024-09-10 Day 3 学习Canvas这一篇文章就够了
- 2024-09-10 JavaScript实现浏览器本地的图像移动、大小调整和裁剪
- 2024-09-10 微信内置浏览器动态生成二维码并长按识别
- 2024-09-10 Python奇淫技巧之自动登录哔哩哔哩
- 2024-09-10 JSPDF + html2canvas A4分页截断(html做分页)
- 2024-09-10 vue手把手教学~搭建web聊天室(vue简单聊天室)
- 2024-09-10 前端:从零实现一款可视化图片编辑器
- 12-29台式机键盘fn是哪个键(台式键盘的fn在哪里)
- 12-29usb无线网卡多少钱(usb无线网卡多少钱一个月)
- 12-29鲁大师cpu跑分天梯图2025(鲁大师性能天梯)
- 12-29手机qq怎么找回以前删除的好友
- 12-29u盘电脑显示格式化怎么办(u盘电脑提示格式化是什么意思)
- 12-29电脑版qq空间网址(电脑版qq空间网站)
- 12-29cpu温度检测软件下载(cpu温度测试)
- 12-29电脑天梯图显卡(电脑显卡天梯图最新)
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (73)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)
