<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
#button{
width: 60px;
height: 20px;
}
</style> </head>
<body>
<canvas id="canvas" width="600px" height="400px" style="background: #DBDDDF; "></canvas>
<input type="button" value="撤销" id="button"> <script type="text/javascript">
var canvas=document.getElementById('canvas');
var cext=canvas.getContext('2d'); cext.strokeStyle="black";
cext.lineWidth=2;
cext.fillStyle="black"; function getStyles(obj){//兼容FF,IE10; IE9及以下未测试
return document.defaultView.getComputedStyle(obj);
}
function getCanvasPos(canvas,e)
{//获取鼠标在canvas上的坐标
var rect = canvas.getBoundingClientRect();
var leftB = parseInt(getStyles(canvas).borderLeftWidth);//获取的是样式,需要转换为数值
var topB = parseInt(getStyles(canvas).borderTopWidth);
return {
x: (e.clientX - rect.left) - leftB,
y: (e.clientY - rect.top) - topB
};
} var restorePoint = {};
var shuzu=[];
var h=0;
var x1,x2,newx,newy; canvas.onmousedown=function (e) {
restorePoint = cext.getImageData(0, 0, canvas.width, canvas.height);
x1=getCanvasPos(canvas,e).x;
x2=getCanvasPos(canvas,e).y;
canvas.onmousemove=function(e){
cext.putImageData(restorePoint, 0, 0);
newx=getCanvasPos(canvas,e).x;
newy=getCanvasPos(canvas,e).y;
cext.beginPath();
cext.moveTo(x1,x2);
cext.lineTo(newx,newy);
cext.stroke();
cext.closePath();
}
} canvas.onmouseup=function(){
shuzu[h] = restorePoint;
h++;
canvas.onmousemove=null; } document.getElementById("button").onmousedown=function(){
restorePoint = shuzu[h-1];
cext.putImageData(restorePoint, 0, 0);
h--;
}
</script>
</body>
</html>

最新文章

  1. 安装 pywin32-218.win32-py2.7.exe 报错python version 2.7 required,which was not found in the registry解决方案
  2. 如何自己编写一个easyui插件
  3. BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元
  4. [札记]IL经典指令解析之方法调度
  5. javascript之高级函数应用思想
  6. NEsper z
  7. A Simple Problem with Integers(线段树,区间更新)
  8. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
  9. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
  10. 微信公众平台开发-微信服务器IP接口实例(含源码)
  11. 编码的秘密(python版)
  12. listview--Java泛型应用之打造Android万能ViewHolder-超简洁写法
  13. AngularJS学习之旅—AngularJS 简介(一)
  14. 前后端分离的利器:fiddler的实用功能举例
  15. 将自己的ubuntu18.04打包成镜像
  16. CSS-弹性布局-伪类选择器-复杂选择器
  17. Agreementhasbeenupdated--EditPhoneNumber
  18. ng-model 数据不更新 及 ng-repeat【ngRepeat:dupes】错误
  19. 抹掉Scala的糖衣(14) -- Update Method
  20. C# 轻松读取、改变文件的创建、修改、访问时间 z

热门文章

  1. python之列表及其方法---整理集
  2. MySQL8.0.15安装教程(Windows)
  3. Python校验文件MD5值
  4. mysql数据库优化之 如何选择合适的列建立索引
  5. 切面编程AOP之KingAOP
  6. Java并发编程之并发容器
  7. AOP-事物管理
  8. select 的选中问题
  9. identityserver4 代码系列
  10. 移动端使用fastclick时,模拟原生浏览器对象