Html代码

<script type="text/javascript" src="jquery-1.9.1.min.js"></script>

<!-- 定义画板的区域 -->
<canvas id="myCanvas" style="background-color: black; border: 1px solid #BFBFBF;"></canvas><br/> <!-- 清空画板的按钮 -->
<button onclick="clean();" style="height: 3em;width: 5em;">清 空</button> <!-- 根据画板里的内容,生成图片 -->
<button onclick="savePic();" style="height: 3em;width: 6em;">生成图片</button><br/> <!-- 生成的图片存放的img标签 -->
<img id="img" alt="请签名" width="100px" /> <script type="text/javascript"> var canvas; //定义一个全局的 canvas
var board; //定义一个画板的 全局变量
var img; //图片
var mousePress = false; //鼠标按压全局变量 , 默认不按压
var last = null; //最后的按压点全局变量 ,默认没有最后按压坐标 //页面加载后进行的操作
$(function(){ canvas = document.getElementById('myCanvas'); //指定canvas区域
img= document.getElementById('img'); //获取图片 canvas.height = 300; //定义 canvas 的高度
canvas.width = 500; //定义 canvas 的宽度 board = canvas.getContext('2d'); //创建画板 board.lineWidth = 2; //画板的书写字体宽度
board.strokeStyle = "#F5270B"; //画板的书写的字体颜色 board.stroke(); canvas.onmousedown = beginDraw;
canvas.onmousemove = drawing;
canvas.onmouseup = endDraw; canvas.addEventListener('touchstart',beginDraw,false);
canvas.addEventListener('touchmove',drawing,false);
canvas.addEventListener('touchend',endDraw,false); }); /**
* 开始画画,将鼠标按压全局变量设为true
*/
function beginDraw(){
mousePress = true;
} /**
* 画画
*/
function drawing(event){ //算出canvs距离顶部的坐标,如果画板的顶部不在页面的最上边,会非常有用
var canvs_top = $('#myCanvas').offset().top;
event.preventDefault(); //如果没有按压,返回
if(!mousePress)return; //获取点触点的坐标
var xy = pos(event); //如果最后的按压点全局变量 不为空,证明手或鼠标没有松开过,从最后按压点到现在按压点划线
if(last!=null){
board.beginPath();
board.moveTo(last.x,last.y-canvs_top);
board.lineTo(xy.x,xy.y - canvs_top); board.lineWidth = 2;
board.strokeStyle = "#F5270B"; board.stroke();
} //将最后的按压点全局变量设置为当前的按压点坐标
last = xy;
} /**
* 结束画画
*/
function endDraw(event){
mousePress = false;
event.preventDefault();
last = null;
} /**
* 生成的图片存放的img标签
*/
function savePic(){
var dataUrl = canvas.toDataURL();
img.src = dataUrl;
} /**
* 清空画板
*/
function clean(){
board.clearRect(0,0,canvas.width,canvas.height);
} /**
* 获取按压点的坐标
*/
function pos(event){
var x,y;
if(isTouch(event)){
x = event.touches[0].pageX;
y = event.touches[0].pageY;
}else{
x = event.offsetX+event.target.offsetLeft;
y = event.offsetY+event.target.offsetTop;
}
// log('x='+x+' y='+y);
return {x:x,y:y};
} /**
* 输入坐标变化
*/
function log(msg){
var log = document.getElementById('log');
var val = log.value;
log.value = msg+'n'+val;
} function isTouch(event){
var type = event.type;
if(type.indexOf('touch')>=0){
return true;
}else{
return false;
}
}
</script>

画板(适用于手机、PC端)的更多相关文章

  1. 在thinkPHP3.2.3框架下实现手机和PC端浏览器的切换

    查看thinkphp版本号方法 打开文件“根目录\ThinkPHP\ThinkPHP.php”下的文件ThinkPHP.php,在22--23行可以看到版本信息THINK_VERSION,如下图: 说 ...

  2. PHP判断访问者手机移动端还是PC端的函数,亲测好用

    ,用手机访问PC端WWW域名的时候,自动判断跳转到移动端,用电脑访问M域名手机网站的时候,自动跳转到PC端,我们团队在开发erdaicms二代旅游CMS网站管理系统的时候(http://www.erd ...

  3. 部分PC端安卓管理器使用强行断开重连的方法来连接手机,容易丢书数据,损坏数据

    最近发现部分PC端的安卓管理器,貌似是百度影音以及PPTV的安卓客户端,使用强行断开手机连接,然后重新连接手机的方法,来实现客户端程序连接手机. 此时,如果刚好正在复制文件,则复制的文件会损坏,并且基 ...

  4. 手机应用PC端演示工具介绍

    写给公司内部用的,所以没什么含量,请免炮轰. 为什么需要在PC端演示? 在Android及IOS系统上开发的手机应用,往往由于设备的限制,无法在演示汇报的场合向在场的众人展示界面,如果有工具可以将手机 ...

  5. h5微信页面在手机微信端和微信web开发者工具中都能正常显示,但是在pc端微信浏览器上打不开(显示空白)

    h5微信页面在手机微信和微信开发者工具中都能正常显示,但是在pc端微信浏览器上打不开或者数据加载不出来. 原因:pc端微信浏览器不支持ES6语法,我的代码中使用了一些ES6的特性 解决:将ES6转换为 ...

  6. 手机控制台调试(需PC端协助)

    工具需求: 1.PC 2.手机(暂时只测试安卓,ios可能是在证书上有区别?) 3.以上两个工具在同一局域网下 步骤:  一 ,PC端登录nodejs官网,选择并下载安装 next,下一步下一步即可( ...

  7. 手机端点击复制链接到剪切板(以及PC端)

    一直在找如何能点击按钮将一串字符串放到手机的剪切板上,但是可能是因为搜索的关键字不对,一直无果. 向同事请教了一下,给了一个clickboard.js的插件.开始试验的时候,使用手机自带浏览器进行测试 ...

  8. Windows 之 手机访问 PC 端本地部署的站点

    测试网页在手机上的显示工具我们可以使用谷歌内核的浏览器,打开开发者工具(F12),在device那里选择设备,然后刷新来查看网页在手机上的显示效果. 但毕竟是模拟的,如果想要在真机上调试该怎么办呢. ...

  9. PC端轻松控制Android手机,PC Control Andoroid,PC控制安卓手机

    记录此次经历的目的是帮助需要的人或下次使用时少走弯路,我为此试用了不少工具及方法,因为追求免费,像"Weak Control:在PC上控制你的Android手机"还要收费的我就不弄 ...

  10. Fiddler4工具配置及调试手机和PC端浏览器

    Fiddler最大的用处: 模拟请求.修改请求.手机应用调试 Fiddler最新版本 下载地址: http://www.telerik.com/download/fiddler Fiddler 想要监 ...

随机推荐

  1. NOIp知识点复习——最短路计数

    $Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...

  2. 51nod1049 最大子段和【动态规划】

    N个整数组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续子段和的最大值.当所给的整数均为负数时和为0. 例如:-2,11,-4,13,-5,- ...

  3. uva 202(Repeating Decimals UVA - 202)

    题目大意 计算循环小数的位数,并且按照格式输出 怎么做 一句话攻略算法核心在于a=a%b*10,用第一个数组记录被除数然后用第二个数组来记录a/b的位数.然后用第三个数组记录每一个被除数出现的位置好去 ...

  4. 37.分组聚合操作—其他metric

    课程大纲     要学其他的metric(count,avg,max,min,sum) count:bucket,terms,自动就会有一个doc_count,就相当于是count avg:avg a ...

  5. Marshal.ReleaseComObject() vs. Marshal.FinalReleaseComObject()

    很简单,不翻译了. If you are using COM components on your .NET code, you might be already aware of the Marsh ...

  6. 简单的SpringBoot环境搭建

    开始搭建前请确认您的计算机中的Maven已正确配置 一:使用IDEA创建一个Maven项目,图中第一个指针请选择自己正在使用的JDK版本,指针二请打勾,选中指针三所指向的类型并点击Next 二:填写G ...

  7. scrapy——3 crawlSpider——爱问

    scrapy——3  crawlSpider crawlSpider 爬取一般网站常用的爬虫类.其定义了一些规则(rule)来提供跟进link的方便的机制. 也许该spider并不是完全适合您的特定网 ...

  8. Java基础之构造方法及其应用

    构造方法是一种特殊的方法,它是一个与类同名且无返回值类型(连void也不能有)的方法. 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化. 当类实例化一个对象时会自动调用构造方法.构造方 ...

  9. java中Long 和long的区别

    Java的数据类型分两种:1.基本类型:long,int,byte,float,double,char2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,S ...

  10. mysql grant 用户权限总结

    https://blog.csdn.net/anzhen0429/article/details/78296814