试用支持canvas的浏览器,无JS依赖,运用新的HTML5技术
DrawBoard.renderDrawer('myHandWrite',{
  penColor:'#FF0000',
  penWidth:'1px'
});
仅一段代码就可渲染出整个绘图板
​1. [文件] Drawer.js 
/**
* @class Canvas DrawBoard
* @author Jason <brotherqian@163.com>
* @version 1.1
* @singleton
* @fileoverview
*   Build Date:2014/04/12
*   The application is valid in a browser that supports HTML5 canvas object.
*   A default canvas tag will render to the div you have appointed
*   You can use this application like this:
*      DrawBoard.renderDrawer('myHandWrite',{
*          penColor:'#FF0000',
*          penWidth:'1px'
*      });
*   If you need a text background,this will help:
*      DrawBoard.formatText('Sign here');
*   See {@link DrawBoard.renderDrawer} for more details
*/
   var DrawBoard/*DrawBoard对象*/={};
   DrawBoard.Id="";
   DrawBoard.penColor="#FF0000";
   DrawBoard.penWidth=0;
   DrawBoard.mouseX/*鼠标位置X*/=0;
   DrawBoard.mouseY/*鼠标位置Y*/=0;
   DrawBoard.isMouseDown/**/=false;
   DrawBoard.isMouseMove/**/=false;
   DrawBoard.mousePath/**/=new Array();
   DrawBoard.mousePosition/**/={x:0,y:0};
   DrawBoard.Events/*事件列表*/={
       onMouseMove/*鼠标移动*/:function(e){
           var me=DrawBoard;
           var ctx=me.Context;
           var canvas=me.Canvas;
           if(me.isMouseDown){
              if(me.isMouseMove){
                  ctx.moveTo(me.mouseX,me.mouseY);
                  me.isMouseMove=false;
              }
              me.mouseX= e.layerX;
              me.mouseY= e.layerY+32;
              me.mousePosition={"x":me.mouseX,"y":me.mouseY};
              me.mousePath.push(me.mousePosition);
              ctx.lineTo(me.mouseX, me.mouseY);
              ctx.stroke();
           }
       },
       onMouseDown/*鼠标按下*/:function(e){
           var me=DrawBoard;
           var ctx=me.Context;
           var canvas=me.Canvas;
           canvas.style.borderColor="#808080";
           var rect=canvas.getBoundingClientRect();
           me.isMouseDown=true;
           me.isMouseMove=true;
          //计算鼠标位置 仅适用fireFox
           me.mouseX= e.layerX;
           me.mouseY= e.layerY+32;
           if(me.mousePath.length==0){
               me.redo();
           }
       },
       onMouseOut/*鼠标移出*/:function(e){
           var me=DrawBoard;
           me.isMouseDown=false;
       },
       onMouseUp/*鼠标放开*/:function(e){
           var me=DrawBoard;
           var ctx=me.Context;
           var canvas=me.Canvas;
           canvas.style.borderColor="#C0C0C0";
           me.isMouseDown=false;
       }
   };
 
   /**
    * Render a child element to the node that has a id attribute which values @param id
    * @param {String} id the name that canvas will render as it's child element
    * @param {Object} option the pen color
    *         @argument {String} penColor rgb(0,0,0) or #000000 color
    *         @argument {String} penWidth pen width in pixel
    *         @argument {Int} width canvas board width
    *         @argument {Int} height canvas board height
    */
 
   DrawBoard.renderDrawer/*渲染绘图对象*/=function(id,option){
       var me=DrawBoard;
       var p=option;
       me.Id=id;
       me.penColor=p.penColor||me.penColor;
       me.penWidth= p.penWidth;
       var objContainer=document.getElementById(id);
       //初始化Canvas元素
       var objCanvas=document.getElementById('DrawBoard')||document.createElement('canvas');
       with(objCanvas){
           width= p.width||720;
           height= p.height||400;
           id='DrawBoard';
           style.margin='auto';
           style.border="1px solid #C0C0C0";
           style.borderRadius="4px";
           style.position="absolute";
           style.cursor="url(images/site/pencil.gif),auto";
       }
       objContainer.appendChild(objCanvas);
       var ctx=objCanvas.getContext('2d');
       //初始化canvas上下文对象
       with(ctx){
            lineWidth/*线宽*/=me.penWidth;
            strokeStyle/*描绘颜色*/=me.penColor;
            fillStyle/*填充颜色*/=me.penColor;
            lineCap/*线头样式*/="round";
            lineJoin/*转角样式*/="round";
            miterLimit/*折角锐利度*/=1;
            shadowColor='#FC0000';
            shadowBlur=1;
       }
       //为Canvas元素附加事件
       objCanvas.addEventListener("mousemove",me.Events.onMouseMove,false);
       objCanvas.addEventListener("mouseout",me.Events.onMouseOut,false);
       objCanvas.addEventListener("mouseup",me.Events.onMouseUp,false);
       objCanvas.addEventListener("mousedown",me.Events.onMouseDown,false);
       objCanvas.addEventListener("contextmenu",DrawBoard.redo,false);
       //赋值对象http://www.huiyi8.com/hunsha/hanshi/​
       me.Canvas=me.Canvas||objCanvas;
       me.Context=me.Context||ctx;
   }韩式婚纱照片
   DrawBoard.redo/*清空所有窗体*/=function(){
       var me=DrawBoard;
       var canvas=me.Canvas;
       var ctx=me.Context;
       ctx.clearRect(0,0,canvas.width,canvas.height);
       canvas.width=canvas.width;
       //置空鼠标路径数组
       me.mousePath.splice(0,me.mousePath.length);
       me.renderDrawer(me.Id,me.penColor,me.penWidth);
   };
   DrawBoard.formatText/*绘制一个水印*/=function(text){
       var me=DrawBoard;
       var canvas=me.Canvas;
       var ctx=me.Context;
       ctx.font/*字体*/="100px 宋体";
       ctx.fillText(text,100,200);
       ctx.stroke();
   };
   //取png数据类型
   DrawBoard.getImage=function(){
       return DrawBoard.Context!=null?DrawBoard.Canvas.toDataURL('image/png'):"";
   }
   DrawBoard.download=function(){
 
   }
 
   /**
    * POST you data to the server
    * @param option
    *         @argument {String} method 'POST' or 'GET' is valid
    *         @argument {String} url the address to post to
    *         @argument {String} isDirect if true to use  a asynchronous method,or false to not use
    *         @argument {Function} onSuccess the method to be called upon the success of the request
    */
   DrawBoard.post=function(option){
       var p=option;
       var request=new XMLHttpRequest()||window.ActiveXObject("Microsoft.XMLHttp");
       request.onreadystatechange=function(){
           if(request.readyState==4){
               if(request.status==200){
                   eval(option.onSuccess);
               }else{
 
               }
           }else{
 
           }
       };
       request.open(p.method||'POST', p.url, p.isDirect||true);
       request.send(p.params)
   }

html5 手写的canvas实现的更多相关文章

  1. html5手写签名

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta co ...

  2. canvas画布实现手写签名效果

    最近项目中涉及到移动端手写签名的功能需求,将实现代码记录于此,供小伙伴们参考指摘哦~ HTML代码: <!--手写区--> <div class="mSign_signMa ...

  3. uni-app通过canvas实现手写签名

    分享一个uni-app实现手写签名的方法 具体代码如下: <template> <view > <view class="title">请在下面 ...

  4. Atitit s2018.2 s2 doc list on home ntpc.docx  \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat

    Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系  法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别   ...

  5. HTML5新增核心工具——canvas

    原文:HTML5新增核心工具--canvas Canvas元素称得上是HTML5的核心所在,它是一个依靠JavaScript绘制华丽图像的元素. Canvas由一个可绘制地区HTML代码中的属性定义决 ...

  6. AI应用开发实战 - 手写算式计算器

    扩展手写数字识别应用 识别并计算简单手写数学表达式 主要知识点 了解MNIST数据集 了解如何扩展数据集 实现手写算式计算器 简介 本文将介绍一例支持识别手写数学表达式并对其进行计算的人工智能应用的开 ...

  7. TensorFlow 之 手写数字识别MNIST

    官方文档: MNIST For ML Beginners - https://www.tensorflow.org/get_started/mnist/beginners Deep MNIST for ...

  8. 关于HTML5手机端页面缩放的问题

    通常在写HTML5手机端页面的时候,我们会发现页面所显示元素的比例不正确,那此时我们需要添加的就是: <meta name="viewport" content=" ...

  9. 手写一套迷你版HTTP服务器

    本文主要介绍如何通过netty来手写一套简单版的HTTP服务器,同时将关于netty的许多细小知识点进行了串联,用于巩固和提升对于netty框架的掌握程度. 服务器运行效果 服务器支持对静态文件css ...

随机推荐

  1. opengl加载多个3ds模型失败记

    VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...

  2. javascript判断智能终端信息

    < script type = "text/javascript" > /* * 智能机浏览器版本信息: * */ var browser = { versions: ...

  3. 设计一个线程安全的单例(Singleton)模式

    在设计单例模式的时候.尽管非常easy设计出符合单例模式原则的类类型,可是考虑到垃圾回收机制以及线程安全性.须要我们思考的很多其它.有些设计尽管能够勉强满足项目要求,可是在进行多线程设计的时候.不考虑 ...

  4. Django之便签生成

    myblog_tag.py #coding:utf-8 __author__ = 'similarface'from django import template register=template. ...

  5. Java结束线程的三种方法

    线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...

  6. hashCode与equals的作用与区别及应当注意的细节

    最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的,所以决定把它们研究一下. 以前写程序一直没有注意hashCode的作用 ...

  7. Tsung 初步介绍安装

    tsung是erlang的一个开源的一个压力测试工具,可以测试包括HTTP, WebDAV, Mysql, PostgreSQL, LDAP, and XMPP/Jabber等服务器.针对 HTTP ...

  8. 简单理解ThreadLocal原理和适用场景

    https://blog.csdn.net/qq_36632687/article/details/79551828?utm_source=blogkpcl2 参考文章: 正确理解ThreadLoca ...

  9. Portal实现原理

    https://blog.csdn.net/sukyle/article/details/6456930

  10. 目标跟踪之粒子滤波---Opencv实现粒子滤波算法

    目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...