网站首页 > 技术文章 正文
新项目有一个需求:客户需要在订单确认的时候签名。
第一反应就是用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 前端:从零实现一款可视化图片编辑器
- 最近发表
-
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
- [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
- 超详细手把手搭建在ubuntu系统的FFmpeg环境
- Nginx运维之路(Docker多段构建新版本并增加第三方模
- 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
- Go 人脸识别教程_piwigo人脸识别
- 安卓手机安装Termux——搭建移动服务器
- ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
- Rust开发环境搭建指南:从安装到镜像配置的零坑实践
- Windows系统安装VirtualBox构造本地Linux开发环境
- 标签列表
-
- 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)
