|
@@ -1,7 +1,8 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div :class="classes">
|
|
<div :class="classes">
|
|
|
- <div class="nut-signature-inner">
|
|
|
|
|
|
|
+ <div :class="['nut-signature-inner', taroEnv === 'WEAPP' ? 'spcanvas_WEAPP' : '']">
|
|
|
<canvas
|
|
<canvas
|
|
|
|
|
+ ref="spcanvas"
|
|
|
class="spcanvas"
|
|
class="spcanvas"
|
|
|
id="spcanvas"
|
|
id="spcanvas"
|
|
|
canvasId="spcanvas"
|
|
canvasId="spcanvas"
|
|
@@ -19,7 +20,7 @@
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
|
-import Taro, { eventCenter, getCurrentInstance as getCurrentInstanceTaro } from '@tarojs/taro';
|
|
|
|
|
|
|
+import Taro from '@tarojs/taro';
|
|
|
import { ref, reactive, onMounted, computed } from 'vue';
|
|
import { ref, reactive, onMounted, computed } from 'vue';
|
|
|
import { createComponent } from '@/packages/utils/create';
|
|
import { createComponent } from '@/packages/utils/create';
|
|
|
const { componentName, create, translate } = createComponent('signature');
|
|
const { componentName, create, translate } = createComponent('signature');
|
|
@@ -58,6 +59,8 @@ export default create({
|
|
|
[`${props.customClass}`]: props.customClass
|
|
[`${props.customClass}`]: props.customClass
|
|
|
};
|
|
};
|
|
|
});
|
|
});
|
|
|
|
|
+ const spcanvas: any = ref<HTMLElement | null>(null);
|
|
|
|
|
+
|
|
|
const state: any = reactive({
|
|
const state: any = reactive({
|
|
|
canvas: null,
|
|
canvas: null,
|
|
|
canvasHeight: 0,
|
|
canvasHeight: 0,
|
|
@@ -67,6 +70,9 @@ export default create({
|
|
|
|
|
|
|
|
const startEventHandler = (event: MouseEvent) => {
|
|
const startEventHandler = (event: MouseEvent) => {
|
|
|
event.preventDefault();
|
|
event.preventDefault();
|
|
|
|
|
+ if (!state.ctx) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
emit('start');
|
|
emit('start');
|
|
|
state.ctx.beginPath();
|
|
state.ctx.beginPath();
|
|
|
state.ctx.lineWidth = props.lineWidth;
|
|
state.ctx.lineWidth = props.lineWidth;
|
|
@@ -75,13 +81,22 @@ export default create({
|
|
|
|
|
|
|
|
const moveEventHandler = (event) => {
|
|
const moveEventHandler = (event) => {
|
|
|
event.preventDefault();
|
|
event.preventDefault();
|
|
|
-
|
|
|
|
|
|
|
+ if (!state.ctx) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
let evt = event.changedTouches[0];
|
|
let evt = event.changedTouches[0];
|
|
|
emit('signing', evt);
|
|
emit('signing', evt);
|
|
|
- let mouseX = evt.x;
|
|
|
|
|
- let mouseY = evt.y;
|
|
|
|
|
- state.ctx.lineTo(mouseX, mouseY);
|
|
|
|
|
- state.ctx.stroke();
|
|
|
|
|
|
|
+ let mouseX = evt.x || evt.clientX;
|
|
|
|
|
+ let mouseY = evt.y || evt.clientY;
|
|
|
|
|
+
|
|
|
|
|
+ if (Taro.getEnv() === 'WEB') {
|
|
|
|
|
+ let coverPos = spcanvas.value.getBoundingClientRect();
|
|
|
|
|
+ mouseX = evt.clientX - coverPos.left;
|
|
|
|
|
+ mouseY = evt.clientY - coverPos.top;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ state.ctx?.lineTo(mouseX, mouseY);
|
|
|
|
|
+ state.ctx?.stroke();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const endEventHandler = (event) => {
|
|
const endEventHandler = (event) => {
|
|
@@ -115,39 +130,71 @@ export default create({
|
|
|
.exec(async (res) => {
|
|
.exec(async (res) => {
|
|
|
Taro.canvasToTempFilePath({
|
|
Taro.canvasToTempFilePath({
|
|
|
canvas: res[0].node,
|
|
canvas: res[0].node,
|
|
|
- fileType: props.type
|
|
|
|
|
- })
|
|
|
|
|
- .then((res) => {
|
|
|
|
|
- emit('confirm', res.tempFilePath);
|
|
|
|
|
- })
|
|
|
|
|
- .catch((e) => {
|
|
|
|
|
- emit('confirm', e);
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ canvasId: 'spcanvas',
|
|
|
|
|
+ fileType: props.type,
|
|
|
|
|
+ success: function (result) {
|
|
|
|
|
+ emit('confirm', state.canvas, result.tempFilePath);
|
|
|
|
|
+ },
|
|
|
|
|
+ fail: function (result) {
|
|
|
|
|
+ emit('confirm', result);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Taro.canvasToTempFilePath({
|
|
|
|
|
+ // canvas: res[0].node,
|
|
|
|
|
+ // canvasId: 'spcanvas',
|
|
|
|
|
+ // fileType: props.type
|
|
|
|
|
+ // })
|
|
|
|
|
+ // .then((res) => {
|
|
|
|
|
+ // emit('confirm', res.tempFilePath);
|
|
|
|
|
+ // })
|
|
|
|
|
+ // .catch((e) => {
|
|
|
|
|
+ // emit('confirm', e);
|
|
|
|
|
+ // });
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
- eventCenter.once((getCurrentInstanceTaro() as any).router.onReady, () => {
|
|
|
|
|
- Taro.createSelectorQuery()
|
|
|
|
|
- .select('#spcanvas')
|
|
|
|
|
- .fields(
|
|
|
|
|
- {
|
|
|
|
|
- node: true,
|
|
|
|
|
- size: true
|
|
|
|
|
- },
|
|
|
|
|
- function (res) {
|
|
|
|
|
- const canvas = res.node;
|
|
|
|
|
- const ctx = canvas.getContext('2d');
|
|
|
|
|
- state.canvas = canvas;
|
|
|
|
|
- state.ctx = ctx;
|
|
|
|
|
- state.canvasWidth = res.width;
|
|
|
|
|
- state.canvasHeight = res.height;
|
|
|
|
|
|
|
+ Taro.nextTick(() => {
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ if (Taro.getEnv() === 'WEAPP') {
|
|
|
|
|
+ Taro.createSelectorQuery()
|
|
|
|
|
+ .select('#spcanvas')
|
|
|
|
|
+ .fields(
|
|
|
|
|
+ {
|
|
|
|
|
+ node: true,
|
|
|
|
|
+ size: true
|
|
|
|
|
+ },
|
|
|
|
|
+ function (res) {
|
|
|
|
|
+ const canvas = res.node;
|
|
|
|
|
+ const ctx = canvas.getContext('2d');
|
|
|
|
|
+ state.canvas = canvas;
|
|
|
|
|
+ state.ctx = ctx;
|
|
|
|
|
+ state.canvasWidth = res.width;
|
|
|
|
|
+ state.canvasHeight = res.height;
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+ .exec();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.log(document.getElementById('spcanvas')?.tagName);
|
|
|
|
|
+ const canvasDom: HTMLElement | null = document.getElementById('spcanvas');
|
|
|
|
|
+ let canvas: HTMLCanvasElement = canvasDom as HTMLCanvasElement;
|
|
|
|
|
+ if (canvasDom?.tagName !== 'CANVAS') {
|
|
|
|
|
+ canvas = canvasDom?.getElementsByTagName('canvas')[0] as HTMLCanvasElement;
|
|
|
}
|
|
}
|
|
|
- )
|
|
|
|
|
- .exec();
|
|
|
|
|
|
|
+ // const canvas: any = document.getElementById('spcanvas')?.getElementsByTagName('canvas')[0];
|
|
|
|
|
+ const ctx = canvas.getContext('2d');
|
|
|
|
|
+ state.canvas = canvas;
|
|
|
|
|
+ state.ctx = ctx;
|
|
|
|
|
+ state.canvasWidth = canvas.width;
|
|
|
|
|
+ state.canvasHeight = canvas.height;
|
|
|
|
|
+ }
|
|
|
|
|
+ }, 1000);
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
return {
|
|
return {
|
|
|
|
|
+ taroEnv: Taro.getEnv(),
|
|
|
|
|
+ spcanvas,
|
|
|
confirm,
|
|
confirm,
|
|
|
clear,
|
|
clear,
|
|
|
classes,
|
|
classes,
|