基于Vue的移动端电子签名demo

HTML

<template>
	<div id='canvasBox'>
		<div ref="canvasBox">
		     <canvas id="canvas" ref="canvas" height="150"></canvas>
		</div>
		<div class="row row-space-between">
		  <button  @click="onClickCancle">取消</button>
		  <button @click="clear">重签</button>
		  <button @click="save">确认</button>
		</div>
		<!-- <img :src="singImgUrl" alt /> -->
	</div>
</template>

JS相关代码

<script>
var draw;

var preHandler = function(e) {
  e.preventDefault();
};

class Draw {
  constructor(el) {
    this.el = el;

    this.canvas = document.getElementById(this.el);

    this.cxt = this.canvas.getContext("2d");

    this.stage_info = canvas.getBoundingClientRect();

    this.path = {
      beginX: 0,

      beginY: 0,

      endX: 0,

      endY: 0
    };
  }

  init(btn) {
    var that = this;

    this.canvas.addEventListener("touchstart", function(event) {
      document.addEventListener("touchstart", preHandler, false);

      that.drawBegin(event);
    });

    this.canvas.addEventListener("touchend", function(event) {
      document.addEventListener("touchend", preHandler, false);

      that.drawEnd();
    });

    this.clear(btn);
  }

  drawBegin(e) {
    var that = this;

    window.getSelection()
      ? window.getSelection().removeAllRanges()
      : document.selection.empty();

    this.cxt.strokeStyle = "#BC4C2D";

    this.cxt.beginPath();

    this.cxt.moveTo(
      e.changedTouches[0].clientX - this.stage_info.left,

      e.changedTouches[0].clientY - this.stage_info.top
    );

    this.path.beginX = e.changedTouches[0].clientX - this.stage_info.left;

    this.path.beginY = e.changedTouches[0].clientY - this.stage_info.top;

    canvas.addEventListener("touchmove", function() {
      that.drawing(event);
    });
  }

  drawing(e) {
    this.cxt.lineTo(
      e.changedTouches[0].clientX - this.stage_info.left,

      e.changedTouches[0].clientY - this.stage_info.top
    );

    this.path.endX = e.changedTouches[0].clientX - this.stage_info.left;

    this.path.endY = e.changedTouches[0].clientY - this.stage_info.top;

    this.cxt.stroke();
  }

  drawEnd() {
    document.removeEventListener("touchstart", preHandler, false);

    document.removeEventListener("touchend", preHandler, false);

    document.removeEventListener("touchmove", preHandler, false);

    //canvas.ontouchmove = canvas.ontouchend = null
  }

  clear(btn) {
    this.base64Id = "";
    this.cxt.clearRect(0, 0, 500, 600);
  }

  save() {
    var blank = document.createElement("canvas"); //系统获取一个空canvas对象
    blank.width = canvas.width;
    blank.height = canvas.height;
    let flag = canvas.toDataURL("image/png") == blank.toDataURL(); //比较值相等则为空;
    if (flag) {
      return "0";
    } else {
      return canvas.toDataURL("image/png");
    }
  }
}
export default {
  data() {
    return {
      singImgUrl: ""
    };
  },
  methods: {
	 clear() {
        draw.clear();
        this.base64Id = "";
	 },
   	save() {
      var data = "";
      data = draw.save();
      if (data == "0") {
      		this.$toast("请先签名再点击确定哦~");
      } else {
	      this.singImgUrl = data;
	      ///data 就是得到的base64格式的签名图片,根据业务这里可上传到服务器
      }
      // 
    },
},
 mounted() {
 document.getElementById("canvasBox").addEventListener("touchmove", (e) => {
      e.preventDefault();
    });//阻止浏览器默认行为,防止签名浏览器下拉-------很重要
    this.base64Id = "";
    let _width = this.$refs.canvasBox.offsetWidth;
    this.$refs.canvas.width = _width; //适配移动端宽度给canvas
    draw = new Draw("canvas");
    draw.init();
  }
}
</script>

CSS 自行美化,相信大家都没得问题_

拿来即用,加油!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值