试用支持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. 启动Nginx目录浏览功能及 让用户通过用户名密码认证访问web站点

    一.启动Nginx目录浏览功能  [root@abcdocker extra]# cat w.conf server { listen 80; server_name IP地址; location / ...

  2. 一次JVM调优的笔记

    1. JVM Tuning基础知识 1.1 Java堆结构 Java堆可以处于物理上不连续的内存空间上,只要逻辑上是连续的即可.Java堆就是各种对象分配和保存的内存空间,线程间共享.Java堆分为E ...

  3. Notepad2替换记事本--映像劫持

     Image File Execution Options就是映像劫持技术,通过此种方式替换记事本,非常地绿色环保. Image File Execution Options是CreateProces ...

  4. 【Java项目实战】——DRP之HTML总结

    在DRP的学习之中,又将之前BS的内容又一次复习了一遍,借着复习的机会将BS的各个部分再又一次总结一下.今天来总结一下HTML. 在学习BS之后就进入了权限系统的开发之中,可是仍然发现非常多代码不会不 ...

  5. Chrome自带恐龙小游戏的源码研究(六)

    在上一篇<Chrome自带恐龙小游戏的源码研究(五)>中实现了眨眼睛的恐龙,这一篇主要研究恐龙的跳跃. 恐龙的跳跃 游戏通过敲击键盘的Spacebar或者Up来实现恐龙的跳跃.先用一张图来 ...

  6. MagicalRecord使用教程【转载】

    原文地址:http://www.ithao123.cn/content-96403.html 下面是在xcode5.1下ARC环境中的使用教程 1. 将 MagicalRecord 文件夹拖入到工程文 ...

  7. 使用Excel2007去反复功能时要注意的一个问题

    作者:iamlaosong Excel2007有个去反复功能(菜单:数据----删除反复项).非常实用,过去须要用VBA编程实现的功能,如今点击一下图标即可了.去反复通常是指定某列或者某几列.依据这指 ...

  8. vs2013数据库连接对应的dll

    mysql for visual studio 1.1.1mysql connector net 6.3.9mysql connector/odbc 5.3

  9. Appium python Uiautomator2 多进程问题

    appium更新uiautomator后可以获取tost了,大家都尝试,课程中也讲解了,但是这些跑的时候都在单机上,当我们多机并发的时候会出现一个端口问题,因为我们appium最后会调用uiautom ...

  10. 架构 -- java

    @.sql写在dao层 原文:http://blog.csdn.net/y_dzaichirou/article/details/53673528 @.Java Web项目需要掌握的技能 原文:htt ...