Home  >  Article  >  Web Front-end  >  Detailed explanation of the sample code of the signature panel that supports touch screen in canvas in HTML5

Detailed explanation of the sample code of the signature panel that supports touch screen in canvas in HTML5

黄舟
黄舟Original
2017-03-21 15:31:063007browse

1. Foreword

I have been too busy recently. I resigned after the National Day and slowly started looking for a job. I have been working in my current company for more than half a month. I feel so sad. I cried beyond words. During the interview process, I saw one scammer company after another. Several companies only worked for one day and then left. Among them, there was one company that worked overtime until 10 o'clock on the first day of work. It's too far on Tiyu West Road. It's too tiring to squeeze in the bus on the first day back home. I used to walk to work, so I'm really not suitable for taking the bus. Some companies will tell you about big data during interviews. Performance optimization and so on. When I entered the company, I saw that they were using the simplest three layers. There were no design patterns. In short, it was too sad. Fortunately, the company is not bad now. Looking for a job is all about it. It is better to be deficient than excessive.

2.canvcas tag

canvasBasic tutorial: The 5ba626b379994d53f7acf72a64f9b697 tag defines graphics, such as charts and other images. The HTML5 canvas element uses JavaScript to draw images on the web page. You can even create and manipulate animations on canvas, which is not possible with brushes and oil paints. Full HTML5 support across all web browsers is not yet complete, but among the emerging support, canvas already works well on almost all modern browsers. canvas has many ways to draw paths, rectangles, circles, characters, and add images. I have been in the company for a month and it is mainly about learning. I am doing backend development and I have never used Oracle database before. This month I have mainly learned about some new features of H5 and css3.0. Now Oracle is working on it. The installation and deployment on the server, some data import and export, data backup, etc., the front-end things are relatively poor. Now is also an opportunity to learn, so I should study hard.

3. Handwritten signature panel

The company makes an automated office OA system. Some audit areas need to add some handwritten signature functions. I didn’t have any ideas at the beginning, so I looked for them online. After looking at the information, I found out that H5 has this new canvcas label, and I was particularly happy. So I took it over and tried it, and it really worked.

4. Page code

@{
    Layout = null;
}<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Testpage</title>
    <script src="~/Assets/jquery-2.1.1.js"></script>
    <script src="~/Assets/bootstrap/bootstrap.js"></script>
    <link href="~/Assets/bootstrap/bootstrap.css" rel="stylesheet" />
    <script src="~/Scripts/WritingPad.js"></script>
    <script src="~/Assets/jq-signature.js"></script>
</head>
<body style="background-color:#b6ff00">

    <button class="btn btn-primary" type="button" style="position:relative">点击我</button>

</body>
</html>
<script>

    $(function () {

        $(".btn,.btn-primary").click(function () {            
        var wp = new WritingPad();            
        //wp.init();        });
    });</script>

5. Script code one

/**
 * 功能:签名canvas面板初始化,为WritingPad.js手写面板js服务。
 * 作者:黄金锋 (549387177@qq.com)
 * 日期:2015-11-15  15:51:01
 * 版本:version 1.0
 */

(function (window, document, $) {
    &#39;use strict&#39;;

  // Get a regular interval for drawing to the screen
  window.requestAnimFrame = (function (callback) {
    return window.requestAnimationFrame || 
      window.webkitRequestAnimationFrame ||
      window.mozRequestAnimationFrame ||
      window.oRequestAnimationFrame ||
      window.msRequestAnimaitonFrame ||
      function (callback) {
        window.setTimeout(callback, 1000/60);
      };
  })();

  /*
  * Plugin Constructor
  */

  var pluginName = &#39;jqSignature&#39;,
      defaults = {
        lineColor: &#39;#222222&#39;,
        lineWidth: 1,
        border: &#39;1px dashed #CCFF99&#39;,
        background: &#39;#FFFFFF&#39;,
        width: 500,
        height: 200,
        autoFit: false
      },
      canvasFixture = &#39;<canvas></canvas>&#39;;

  function Signature(element, options) {
    // DOM elements/objects
    this.element = element;
    this.$element = $(this.element);
    this.canvas = false;
    this.$canvas = false;
    this.ctx = false;
    // Drawing state
    this.drawing = false;
    this.currentPos = {
      x: 0,
      y: 0
    };
    this.lastPos = this.currentPos;
    // Determine plugin settings
    this._data = this.$element.data();
    this.settings = $.extend({}, defaults, options, this._data);
    // Initialize the plugin
    this.init();
  }

  Signature.prototype = {
    // Initialize the signature canvas
    init: function() {
      // Set up the canvas
      this.$canvas = $(canvasFixture).appendTo(this.$element);
      this.$canvas.attr({
        width: this.settings.width,
        height: this.settings.height
      });
      this.$canvas.css({
        boxSizing: &#39;border-box&#39;,
        width: this.settings.width + &#39;px&#39;,
        height: this.settings.height + &#39;px&#39;,
        border: this.settings.border,
        background: this.settings.background,
        cursor: &#39;crosshair&#39;
      });
      // Fit canvas to width of parent
      if (this.settings.autoFit === true) {
        this._resizeCanvas();
      }
      this.canvas = this.$canvas[0];
      this._resetCanvas();
      // Set up mouse events
      this.$canvas.on(&#39;mousedown touchstart&#39;, $.proxy(function(e) {
        this.drawing = true;
        this.lastPos = this.currentPos = this._getPosition(e);
      }, this));
      this.$canvas.on(&#39;mousemove touchmove&#39;, $.proxy(function(e) {
        this.currentPos = this._getPosition(e);
      }, this));
      this.$canvas.on(&#39;mouseup touchend&#39;, $.proxy(function(e) {
        this.drawing = false;
        // Trigger a change event
        var changedEvent = $.Event(&#39;jq.signature.changed&#39;);
        this.$element.trigger(changedEvent);
      }, this));
      // Prevent document scrolling when touching canvas
      $(document).on(&#39;touchstart touchmove touchend&#39;, $.proxy(function(e) {
        if (e.target === this.canvas) {
          e.preventDefault();
        }
      }, this));
      // Start drawing
      var that = this;
      (function drawLoop() {
        window.requestAnimFrame(drawLoop);
        that._renderCanvas();
      })();
    },
    // Clear the canvas
    clearCanvas: function() {
      this.canvas.width = this.canvas.width;
      this._resetCanvas();
    },
    // Get the content of the canvas as a base64 data URL
    getDataURL: function() {
      return this.canvas.toDataURL();
    },

    reLoadData: function () {
        this.$canvas.remove();
        this._data = this.$element.data();

        //for (var i in this.settings) {
        //    alert(i+":"+this.settings[i]);
        //}

        //this.settings = $.extend({}, defaults, this._data);
        this.init();
    },
    // Get the position of the mouse/touch
    _getPosition: function(event) {
      var xPos, yPos, rect;
      rect = this.canvas.getBoundingClientRect();
      event = event.originalEvent;
      // Touch event
      if (event.type.indexOf(&#39;touch&#39;) !== -1) { // event.constructor === TouchEvent
        xPos = event.touches[0].clientX - rect.left;
        yPos = event.touches[0].clientY - rect.top;
      }
      // Mouse event
      else {
        xPos = event.clientX - rect.left;
        yPos = event.clientY - rect.top;
      }
      return {
        x: xPos,
        y: yPos
      };
    },
    // Render the signature to the canvas
    _renderCanvas: function() {
      if (this.drawing) {
        this.ctx.moveTo(this.lastPos.x, this.lastPos.y);
        this.ctx.lineTo(this.currentPos.x, this.currentPos.y);
        this.ctx.stroke();
        this.lastPos = this.currentPos;
      }
    },
    // Reset the canvas context
    _resetCanvas: function() {
      this.ctx = this.canvas.getContext("2d");
      this.ctx.strokeStyle = this.settings.lineColor;
      this.ctx.lineWidth = this.settings.lineWidth;
    },
    // Resize the canvas element
    _resizeCanvas: function() {
      var width = this.$element.outerWidth();
      this.$canvas.attr(&#39;width&#39;, width);
      this.$canvas.css(&#39;width&#39;, width + &#39;px&#39;);
    }
  };

  /*
  * Plugin wrapper and initialization
  */

  $.fn[pluginName] = function ( options ) {
    var args = arguments;
    if (options === undefined || typeof options === &#39;object&#39;) {
      return this.each(function () {
        if (!$.data(this, &#39;plugin_&#39; + pluginName)) {
          $.data(this, &#39;plugin_&#39; + pluginName, new Signature( this, options ));
        }
      });
    } 
    else if (typeof options === &#39;string&#39; && options[0] !== &#39;_&#39; && options !== &#39;init&#39;) {
      var returns;
      this.each(function () {
        var instance = $.data(this, &#39;plugin_&#39; + pluginName);
        if (instance instanceof Signature && typeof instance[options] === &#39;function&#39;) {
            var myArr=Array.prototype.slice.call( args, 1 );
            returns = instance[options].apply(instance, myArr);
        }
        if (options === &#39;destroy&#39;) {
          $.data(this, &#39;plugin_&#39; + pluginName, null);
        }
        //if (options === &#39;reLoadData&#39;) {
        //    //this.$canvas.remove();
        //    $.data(this, &#39;plugin_&#39; + pluginName, null);
        //    this._data = this.$element.data();
        //    this.settings = $.extend({}, defaults, options, this._data);
        //    this.init();
        //}
      });
      return returns !== undefined ? returns : this;
    }
  };

})(window, document, jQuery);

6. Script code two

/**
 * 功能:使用该jQuery插件来制作在线签名或涂鸦板,用户绘制的东西可以用图片的形式保存下来。
 * 作者:黄金锋 (549387177@qq.com)
 * 日期:2015-11-16  13:51:01
 * 版本:version 1.0
 */

var WritingPad = function () {

    var current = null;

    $(function () {

        initHtml();

        initTable();

        initSignature();

        if ($(".modal")) {
            $(".modal").modal("toggle");
        } else {
            alert("没用手写面板");
        }

        $(document).on("click", "#myClose,.close", null, function () {
            $(&#39;#mymodal&#39;).modal(&#39;hide&#39;);
            $("#mymodal").remove();

        });

        $(document).on("click", "#mySave", null, function () {

            var myImg = $(&#39;#myImg&#39;).empty();
            var dataUrl = $(&#39;.js-signature&#39;).jqSignature(&#39;getDataURL&#39;);
            var img = $(&#39;<img>&#39;).attr(&#39;src&#39;, dataUrl);
            $(myImg).append($(&#39;<p>&#39;).text("图片保存在这里"));
            $(myImg).append(img);

        });

        $(document).on("click", "#myEmpty", null, function () {
            $(&#39;.js-signature&#39;).jqSignature(&#39;clearCanvas&#39;);

        });

        $(document).on("click", "#myBackColor", null, function () {

            $(&#39;#colorpanel&#39;).css(&#39;left&#39;, &#39;95px&#39;).css(&#39;top&#39;, &#39;45px&#39;).css("display", "block").fadeIn();
            //$("canvas").css("background", "#EEEEEE");
            $("#btnSave").data("sender", "#myBackColor");
        });

        $(document).on("click", "#myColor", null, function () {
            $(&#39;#colorpanel&#39;).css(&#39;left&#39;, &#39;205px&#39;).css(&#39;top&#39;, &#39;45px&#39;).css("display", "block").fadeIn();
            $("#btnSave").data("sender", "#myColor");
        });

        $(document).on("mouseover", "#myTable", null, function () {

            if ((event.srcElement.tagName == "TD") && (current != event.srcElement)) {
                if (current != null) { current.style.backgroundColor = current._background }
                event.srcElement._background = event.srcElement.style.backgroundColor;
                //$("input[name=DisColor]").css("background-color", event.srcElement.style.backgroundColor);
                //var color = event.srcElement.style.backgroundColor;
                //var strArr = color.substring(4, color.length - 1).split(&#39;,&#39;);
                //var num = showRGB(strArr);
                //$("input[name=HexColor]").val(num);
                current = event.srcElement;
            }

        });

        $(document).on("mouseout", "#myTable", null, function () {

            if (current != null) current.style.backgroundColor = current._background

        });

        $(document).on("click", "#myTable", null, function () {

            if (event.srcElement.tagName == "TD") {
                var color = event.srcElement._background;
                if (color) {
                    $("input[name=DisColor]").css("background-color", color);
                    var strArr = color.substring(4, color.length - 1).split(&#39;,&#39;);
                    var num = showRGB(strArr);
                    $("input[name=HexColor]").val(num);
                }
            }

        });

        $(document).on("click", "#btnSave", null, function () {

            $(&#39;#colorpanel&#39;).css("display", "none");
            var typeData = $("#btnSave").data("sender");
            var HexColor = $("input[name=HexColor]").val();
            var data = $(".js-signature").data();
            if (typeData == "#myColor") {
                data["plugin_jqSignature"]["settings"]["lineColor"] = HexColor;
                $(&#39;.js-signature&#39;).jqSignature(&#39;reLoadData&#39;);
            }
            if (typeData == "#myBackColor") {

                data["plugin_jqSignature"]["settings"]["background"] = HexColor;
                $(&#39;.js-signature&#39;).jqSignature(&#39;reLoadData&#39;);
            }
        });

        $("#mymodal").on(&#39;hide.bs.modal&#39;, function () {
            $("#colorpanel").remove();
            $("#mymodal").remove();
            $("#myTable").remove();
        });

    });

    function initHtml() {

        var html = &#39;<div class="modal" id="mymodal">&#39; +
            &#39;<div class="modal-dialog">&#39; +
                &#39;<div class="modal-content">&#39; +
                    &#39;<div class="modal-header">&#39; +
                        &#39;<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span>
                        <span class="sr-only">Close</span></button>&#39; +
                        &#39;<h4 class="modal-title">手写面板</h4>&#39; +
                    &#39;</div>&#39; +
                    &#39;<div class="modal-body">&#39; +
                        &#39;<div class="js-signature" id="mySignature">&#39; +
                         &#39;</div>&#39; +
                         &#39;<div>&#39; +
                         &#39;<button type="button" class="btn btn-default" id="myEmpty">清空面板</button>&#39; +
                         &#39;<button type="button" class="btn btn-default" id="myBackColor">设置背景颜色</button>&#39; +
                         //&#39;<div style="position:absolute;relative">&#39; +
                         &#39;<button type="button" class="btn btn-default" id="myColor">设置字体颜色</button>&#39; +
                         &#39;<div id="colorpanel" style="position:absolute;z-index:99;display:none"></div>&#39; +
                         //&#39;</div>&#39;+
                         &#39;</div>&#39; +
                    &#39;</div>&#39; +
                    &#39;<div class="modal-footer">&#39; +

                        &#39;<button type="button" class="btn btn-default" id="myClose">关闭</button>&#39; +
                        &#39;<button type="button" class="btn btn-primary" id="mySave">保存</button>&#39; +
                        &#39;<div id="myImg">&#39; +
                        &#39;<div>&#39; +

                    &#39;</div>&#39; +
                &#39;</div>&#39; +
            &#39;</div>&#39; +
        &#39;</div>&#39;;

        $(&#39;body&#39;).append(html);
    }

    function initTable() {
        var colorTable = "";
        var ColorHex = new Array(&#39;00&#39;, &#39;33&#39;, &#39;66&#39;, &#39;99&#39;, &#39;CC&#39;, &#39;FF&#39;);
        var SpColorHex = new Array(&#39;FF0000&#39;, &#39;00FF00&#39;, &#39;0000FF&#39;, &#39;FFFF00&#39;, &#39;00FFFF&#39;, &#39;FF00FF&#39;);
        for (var i = 0; i < 2; i++)
        {
            for (var j = 0; j < 6; j++)
            {
                colorTable = colorTable + &#39;<tr height=12>&#39;;
                colorTable = colorTable + &#39;<td width=11 style="background-color:#000000"></td>&#39;;

                if (i == 0)
                {
                    colorTable = colorTable + &#39;<td width=11 style="background-color:#&#39; + ColorHex[j] + ColorHex[j] + ColorHex[j] + &#39;"></td>&#39;;
                }
                else
                {
                    colorTable = colorTable + &#39;<td width=11 style="background-color:#&#39; + SpColorHex[j] + &#39;"></td>&#39;;
                }

                //colorTable = colorTable + &#39;<td width=11 style="background-color:#000000"></td>&#39;;

                for (var k = 0; k < 3; k++)
                {
                    for (l = 0; l < 6; l++)
                    {
                        colorTable = colorTable + &#39;<td width=11 style="background-color:#&#39; + ColorHex[k + i * 3] + ColorHex[l] + ColorHex[j] + &#39;"></td>&#39;;
                    }
                }
                colorTable = colorTable + &#39;</tr>&#39;;


            }
        }
        colorTable =
        &#39;<table border="1" id="myTable" cellspacing="0" cellpadding="0" style="border-collapse: collapse;cursor:pointer;" bordercolor="000000">&#39;
        + colorTable + &#39;</table>&#39; +
        &#39;<table width=225 border="0" cellspacing="0" cellpadding="0" style="border:1px #000000 solid;border-collapse: collapse;background-color:#000000">&#39; +
        &#39;<tr style="height:30px">&#39; +
        &#39;<td colspan=21 bgcolor=#cccccc>&#39; +

        &#39;<table cellpadding="0" cellspacing="1" border="0" style="border-collapse: collapse">&#39; +
        &#39;<tr>&#39; +
        &#39;<td width="3"><input type="text" name="DisColor" size="6" disabled style="border:solid 1px #000000;background-color:#ffff00"></td>&#39; +
        &#39;<td width="3"><input type="text" name="HexColor" size="7" style="border:inset 1px;font-family:Arial;" value="#000000"></td>&#39; +
         &#39;<td width="3"><button type="button" class="btn btn-primary btn-sm" id="btnSave">确认</button></td>&#39; +
        &#39;</tr>&#39; +
        &#39;</table>&#39; +
       
        &#39;</td>&#39; +
        &#39;</tr>&#39; +
        &#39;</table>&#39;;
        $("#colorpanel").append(colorTable);
    }

    function initSignature() {

        if (window.requestAnimFrame) {
            var signature = $("#mySignature");
            signature.jqSignature({ width: 500, height: 200, border: &#39;1px solid red&#39;, background: &#39;#16A085&#39;, lineColor: &#39;#ABCDEF&#39;, lineWidth: 2, autoFit: false });
            //{ width: 600, height: 200, border: &#39;1px solid red&#39;, background: &#39;#16A085&#39;, lineColor: &#39;#ABCDEF&#39;, lineWidth: 2, autoFit: true }
        } else {

            alert("请加载jq-signature.js");
            return;
        }
    }

    function showRGB(arr) {
        hexcode = "#";
        for (x = 0; x < 3; x++) {
            var n = arr[x];
            if (n == "") n = "0";
            if (parseInt(n) != n)
                return alert("RGB颜色值不是数字!");
            if (n > 255)
                return alert("RGB颜色数字必须在0-255之间!");
            var c = "0123456789ABCDEF", b = "", a = n % 16;
            b = c.substr(a, 1); a = (n - a) / 16;
            hexcode += c.substr(a, 1) + b
        }
        return hexcode;
    }

    function init() {


    }

    return {
        init: function () {
            init();
        }
    };
}

The above is the detailed content of Detailed explanation of the sample code of the signature panel that supports touch screen in canvas in HTML5. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn