试用支持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. cocos2dx3.x使用cocostudio触摸事件不响应的奇葩问题

    刚刚使用3.1,发现了一些关于触摸的不同之处,对于习惯于2.x的人还是认为坑啊,简单总结一下: 使用cocostudio加进来的ui,当某个可触但不可见的时候,给他加入不论什么触摸监听事件都是依照不可 ...

  2. Spring 小记

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 使用STS新建spr ...

  3. fabric使用实例(发布web包的一个例子)

    #!/usr/bin/env python # -*- coding: utf-8 -* #添加中文注释的编码 #fabfile.py from fabric.api import * env.use ...

  4. PHP增加$_ENV变量

    在日常开发过程中,我们常常会将一些系统或模块配写在配置文件里.这样便于程序维护与修改.通常的配置文件有.ini , .xml等.配置文件的好处在于:1,便于管理.2,可读性高.但是,使用配置文件也会有 ...

  5. ceres g2o 安装

    .ceres 安装 Git clone https://github.com/ceres-solver/ceres-solver 安装依赖: # CMake sudo apt-get install ...

  6. neural network and deep learning笔记(1)

    neural network and deep learning 这本书看了陆陆续续看了好几遍了,但每次都会有不一样的收获. DL领域的paper日新月异.每天都会有非常多新的idea出来,我想.深入 ...

  7. cmake学习之- cmake_parse_arguments

    最后更新: 2019-06-08 一.指令介绍 cmake_parse_arguments 为解析函数(function)或 宏(macros) 参数的命令: cmake_parse_argument ...

  8. 浅谈 Fork/Join

    fork/join的java7新添加的功能,能够把它理解成一个并发框架. 我们通过fork/join能将一个可分解的大任务.分解成多个子任务同步运行.运行完成后,在将各子任务的结果进行合并,得到终于的 ...

  9. 深入浅出Attribute(三)

    约定: 1.”attribute”和”attributes”均不翻译 2.”property”译为“属性” 3.msdn中的原句不翻译 4.”program entity”译为”语言元素” Attri ...

  10. 从epoll构建muduo-12 多线程入场

    mini-muduo版本号传送门 version 0.00 从epoll构建muduo-1 mini-muduo介绍 version 0.01 从epoll构建muduo-2 最简单的epoll ve ...