怎么在前端项目里添加一个截图功能呢,今天我们使用js-web-screen-shot 来实现一下,超详细的代码,教你轻轻松松做截图。以下是基于vue3+ts
<template> <!--截图图标--> <svg-icon icon-class="screen" style="style:display:flex;width:22px; height:22px;cursor:pointer;margin:0px 30px 0px 30px;" @click="jitT"/> <!--点击对钩后确认保存--> <el-dialog v-model="confirmDialog" width="40%" :closeOnClickModal="false" title="提示" > <h3 style="display:flex;justify-content:start;font-size: 18px;"> <i class="el-icon-warning" style="margin-top: 16px;margin-right: 18px;"></i> 请确认是否保存截图! </h3> <template #footer class="dialog-footer"> <el-button @click="confirmDialog=false" >取 消</el-button> <el-button type="primary" @click="confirmUpdataName" >确 定</el-button> </template> </el-dialog> <!---可有可无,确认保存后用户添加图片名称--> <el-dialog v-model="nameDialog" :closeOnClickModal="false" width="40%" title="图片名称" > <el-form ref="nameRef" :model="nameData" label-position="left"> <el-form-item label="图片名称:" :rules="[{required:true,message:'请输入图片名称',trigger:['blur','change']}]" prop="name"> <el-input v-model="nameData.name" placeholder="请输入图片名称" style="width:60%"></el-input> </el-form-item> </el-form> <template #footer class="dialog-footer"> <el-button @click="nameDialog=false" >取 消</el-button> <el-button type="primary" @click="confirmSave" >确 定</el-button> </template> </el-dialog></template>
<script lang="ts">import { defineComponent, ref, unref } from 'vue';import { uploadOssApi } from '../api'import { Message } from '_c/Message'import ScreenShort from 'js-web-screen-shot'export default defineComponent({ emits:['imageData'], setup(props, {emit}) { const nameRef = ref() const confirmDialog = ref<Boolean>(false) const nameDialog = ref<Boolean>(false) const imgUrl = ref() const nameData = ref({name:''}) //截图事件 function jitT () { const screenShotHandler = new ScreenShort({ enableWebRtc: false, // 是否显示选项框 level: 99, // 层级级别 completeCallback: callback, //确认回调 closeCallback: closeFn //取消回调 } as any) } //确认回调 const callback = (val:any) => { confirmDialog.value = true imgUrl.value = base64ToBlob(val.base64) } //取消回调 const closeFn = (base64:any) => { console.log(base64) } //转为base64好上传oss function base64ToBlob(code:any) { let parts = code.split(";base64,"); let contentType = parts[0].split(":")[1]; let raw = window.atob(parts[1]); let rawLength = raw.length; let uInt8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], { type: contentType }); } // 上传图片到oss async function confirmSave() { const formWrap = unref(nameRef) formWrap.validate(async(valid:any) => { if (valid) { const form = new FormData() console.log('form',form); form.append('file', imgUrl.value, `${nameData.value.name}.png`) form.append('businessType', 'questionScreen') const res:any = await uploadOssApi({ data: form }) if(res?.code === '200') { const data = {fileId: res.data, fileName: `${nameData.value.name}.png`} emit('imageData',data) nameDialog.value = false nameData.value.name = '' } else { Message.error(res.msg) } } else { console.log('error submit!!') return false } }) } function confirmUpdataName() { confirmDialog.value = false nameDialog.value = true } return { jitT, confirmDialog, nameDialog, confirmUpdataName, confirmSave, nameRef, nameData } }})</script>