<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用vue-esign讓使用者能夠在手動簽字並返回為base64或者file格式的檔案流
npm install vue-esign --save
import vueEsign from 'vue-esign' Vue.use(vueEsign)
Demo
<template> <div class="esigns"> <vue-esign ref="esign" style=" width: 100%; height: 400px " :isCrop="isCrop" :lineWidth="lineWidth" :lineColor="lineColor" :bgColor.sync="bgColor" /> <div class="btn"> <van-button type="primary" @click="handleReset">重置</van-button> <van-button type="info" @click="handleGenerate">確定</van-button> </div> </div> </template>
<script> export default { name: "Esign", data() { return { lineWidth: 6, lineColor: "#000000", bgColor: "", resultImg: "", isCrop: false, }; }, methods: { handleReset() { // 清除 this.$refs.esign.reset(); }, handleGenerate() { // 獲取base64 var _this = this; _this.$refs.esign .generate() .then((res) => { // 轉成檔案 var file = _this.dataURLtoFile(res); console.log("file:",file ) //呼叫介面 uploadFile(file).then(({ data }) => { console.log("data:",data) }); }) .catch((err) => { _this.$toast(err); }); }, // 將base64轉換為file dataURLtoFile(dataurl) { let arr = dataurl.split(","); let mime = arr[0].match(/:(.*?);/)[1]; let bytes = atob(arr[1]); // 解碼base64 let n = bytes.length; let ia = new Uint8Array(n); while (n--) { ia[n] = bytes.charCodeAt(n); } return new File([ia], "easign.jpg", { type: mime }); }, }, }; </script>
<style scoped> .btn { display: flex; justify-content: space-around; margin-top: 10px; } </style>
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 自行美化,相信大家都沒得問題
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45