当前位置: 首页 > news >正文

uniapp的H5实现图片长按保存

实现图片预览

使用uniapp的api实现图片预览,可以缩放,关闭等操作

uni.previewImage({urls:[imageUrl],success:()=>{this.controllTouch();}
})

imageUrl是图片地址,如https://www.111.com/abc/image.png

urls是字符串数组,用来预览图片

因为app可以使用对应的图片下载保存,这里就不多说了,主要讲的是在H5实现图片预览保存功能

长按图片显示保存弹框 

因为H5无法实现长按显示弹框所以,要自己实现这个功能。

1、在图片开始预览时,加上事件监听,手指点击和手指离开

window.addEventListener("touchstart",fnTouchStart,true);
window.addEventListener("touchend",fnTouchEnd,true);

 其中touchstart和touchend是手指开始和离开的监听名字,第二个参数是监听到手指开始和手指离开时所执行的函数。

2、编写手指开始接触屏幕和手指离开时的函数

2、1手指开始接触屏幕

因为在预览时会有两个手指放大缩小图片,单击图片关闭预览的操作,所以需要对这两种情况进行判断。

当监测到屏幕上有两个手指时,不会进行保存图片提示,一个手指长按时会出现提示

其中有几个手指接触屏幕,会体现在事件监听的回调函数的参数中(e.touches.length),长度为多少就表示有多少个手指在接触屏幕。

 2、2手指离开屏幕

在手指离开屏幕时,也会有对应的回调函数表示(e.touches.length),为0表示有一根手指离开屏幕。

2、3实现1秒后,长按提示

使用定时器完成,每次监测到手指点击屏幕时清空定时器,只有在长按1秒后离开屏幕,才会执行定时器里面的内容。

showDownImage 是控制弹框的显示和隐藏,后面有作用

// 触碰屏幕控制
controllTouch(){let flag = false;let timeEvent = null;const fnTouchStart = (e) => {clearTimeout(timeEvent)flag = false;// 判断按住的时间是否超过1秒timeEvent = setTimeout(()=>{if(e.touches.length == 1){flag = true;}else if(e.touches.length == 2){flag = false;}},1000)}const fnTouchEnd = (e) => {if(e.touches.length == 0 && flag){this.showDownImage = true;flag = false;}else{//如果为单击事件,做对应的处理if(!this.showDownImage){this.closeControllTouch(fnTouchStart,fnTouchEnd,timeEvent);}}}window.addEventListener("touchstart",fnTouchStart,true);window.addEventListener("touchend",fnTouchEnd,true);
},

2、4为什么不适用匿名函数实现事件监听?

因为使用匿名函数后,无法对匿名函数进行去掉监听的操作。加入使用以下方法对点击事件进行监听

window.addEventListener("touchstart",(e)=>{console.log(e);
},true);

后续无法拿到上面事件的函数,进行销毁事件监听处理。

3、为单击事件时,关闭预览,去掉事件监听

在上述代码中,使用了非匿名函数形式的事件监听,在这里对移除事件监听,防止在其他页面也显示弹框,同时清理定时器。

closeControllTouch(fnTouchStart,fnTouchEnd,timeEvent){window.removeEventListener("touchstart",fnTouchStart,true);window.removeEventListener("touchend",fnTouchEnd,true);clearTimeout(timeEvent);
},

4、showDownImage 展示弹框

当判断是长按图片时,手指离开屏幕,出现弹框,使用了uview的模态框实现

<u-modal :show="showDownImage"class="comfirm-modal"title="是否保存图片"width="560rpx"confirmColor="#009BF3":showCancelButton="true"confirmText="确认"@confirm="downLoad"@cancel="showDownImage = false"></u-modal>

@confirm="downLoad"是点击确定时,执行函数downLoad下载图片

downLoad() {const url = '';//你要下载的图片地址var xhr = new XMLHttpRequest();xhr.open('get', url, true);xhr.responseType = 'blob';xhr.onload = ()=>{if (xhr.status === 200) {console.log(xhr)var blobUrl = new Blob([xhr.response]);const link = document.createElement('a');link.style.display = 'none';var urlObject = window.URL.createObjectURL(blobUrl);link.href = urlObject;link.download = url;document.body.appendChild(link);link.click();document.body.removeChild(link);}}xhr.send();this.showDownImage = false;this.closePreviewImage();},

下载完成图片之后,关闭模态框,事件监听,操作完成!!!

这是实习期间碰到的问题,希望大佬指正

相关文章:

uniapp的H5实现图片长按保存

实现图片预览 使用uniapp的api实现图片预览&#xff0c;可以缩放&#xff0c;关闭等操作 uni.previewImage({urls:[imageUrl],success:()>{this.controllTouch();} }) imageUrl是图片地址&#xff0c;如https://www.111.com/abc/image.png urls是字符串数组&#xff0c;…...

Java 8:Stream API 流式操作(学习)

Java 8&#xff1a;Stream API Java 8 中的 Stream API 是一组用于对集合数据进行处理的新特性&#xff1b;提供一种以声明式风格对集合进行操作的方式&#xff0c;简化集合的处理&#xff0c;使得代码更加简洁、优雅&#xff0c;并且能够更高效地处理数据&#xff1b; 这种风格…...

04_20 直接使用代码 创建内核模块获取物理内存信息

好像和 free得出来有关 和/proc/meminfo 有关 但是下面是全部的物理页 #include <linux/version.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h>//下面宏表示物理内存空间起始地址 对应页帧号 #define ARCH_PFN_OFFSET…...

<C++> STL_list

1.list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。list与…...

聚类分析 | MATLAB实现基于FCM模糊C均值聚类结果可视化

聚类分析 | MATLAB实现基于FCM模糊C均值聚类结果可视化 目录 聚类分析 | MATLAB实现基于FCM模糊C均值聚类结果可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 FCM模糊C均值聚类&#xff0c;聚类结果可视化&#xff0c;MATLAB程序。 FCM&#xff08;Fuzzy C-Means&a…...

C++笔记之设计模式:setter函数、依赖注入

C笔记之设计模式&#xff1a;setter函数、依赖注入 参考笔记&#xff1a; 1.C笔记之静态成员函数可以在类外部访问私有构造函数吗&#xff1f; 2.C笔记之设计模式&#xff1a;setter函数、依赖注入 3.C笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究…...

Spring MVC详解

文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、接收请求参数3.1 基本类型参数3.2 实体收参【重点】3.3 数组收参3.4 集合收参 【了解】3.5 路径参数3.6 中文乱码 四…...

谷歌公开.zip域名,应采取哪些措施应对可能的安全风险?

近期&#xff0c;谷歌发布了几个新的顶级域名&#xff0c;这些新域名包括.dad、.esq、.prof、.phd、.nexus、.foo、.mov以及本文我们将要提到的.zip域名。自发布以来&#xff0c;多个安全社区都开始讨论这些顶级域名所带来的影响&#xff0c;主要原因是.zip很容易被误认为是文件…...

css3滤镜属性filter让网页变黑白

今天是特殊的日子&#xff0c;抗击疫情全国哀悼日&#xff0c;向英雄们致敬&#xff0c;一路走好&#xff01;应该发现了今天很多网站页面都是黑白色的&#xff0c;我的博客今天都是黑白色&#xff0c;用css3滤镜属性filter让网页马上变黑白&#xff0c;一行代码就搞定。 在你…...

C++教程 - How to C++系列专栏第5篇

关于专栏 这个专栏是优质的C教程专栏&#xff0c;如果你还没看过第0篇&#xff0c;点击这里去第0篇 本专栏一致使用操作系统&#xff1a;macOS Ventura&#xff0c;代码编辑器&#xff1a;CLion&#xff0c;C编译器&#xff1a;Clang 感谢一路相伴的朋友们&#xff0c;感谢你…...

Vue2向Vue3过度核心技术插槽

目录 1 插槽-默认插槽1.作用2.需求3.问题4.插槽的基本语法5.代码示例6.总结 2 插槽-后备内容&#xff08;默认值&#xff09;1.问题2.插槽的后备内容3.语法4.效果5.代码示例 3 插槽-具名插槽1.需求2.具名插槽语法3.v-slot的简写4.总结 4 作用域插槽1.插槽分类2.作用3.场景4.使用…...

vite配置electron、ElementPlus或者AntDesignVue

这是全部的配置原文&#xff1a; import { defineConfig } from vite; import vue from vitejs/plugin-vue; import electron from "vite-plugin-electron"; import electronRenderer from "vite-plugin-electron-renderer"; import polyfillExports from…...

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVD分解重构算法&#xff0c;MATLAB程序&#xff0c;奇异值分解 (Singular Value Decompo…...

强化学习系列--时序差分学习方法(SARSA算法)

强化学习系列--时序差分学习方法&#xff08;SARSA算法&#xff09; 介绍示例代码 介绍 SARSA&#xff08;State-Action-Reward-State-Action&#xff09;是一种强化学习算法&#xff0c;用于解决马尔可夫决策过程&#xff08;MDP&#xff09;中的问题。SARSA算法属于基于值的…...

深度学习9:简单理解生成对抗网络原理

目录 生成算法 生成对抗网络&#xff08;GAN&#xff09; “生成”部分 “对抗性”部分 GAN如何运作&#xff1f; 培训GAN的技巧&#xff1f; GAN代码示例 如何改善GAN&#xff1f; 结论 生成算法 您可以将生成算法分组到三个桶中的一个&#xff1a; 鉴于标签&#…...

adb shell setprop 、开发者选项

App性能调试详解 Android App性能监控工具 更多系统属性参考 一、开启 GPU Render 的profiling bar&#xff1a; Gpu渲染速度 adb shell setprop debug.hwui.profile true adb shell setprop debug.hwui.profile visual_bars adb shell setprop debug.hwui.profile visual…...

性能测试面试问题,一周拿3个offer不嫌多

性能测试的三个核心原理是什么&#xff1f; 1.基于协议。性能测试的对象是网络分布式架构的软件&#xff0c;而网络分布式架构的核心是网络协议 2.多线程。人的大脑是单线程的&#xff0c;电脑的cpu是多线程的。性能测试就是利用多线程的技术模拟多用户去负载 3.模拟真实场景。…...

Android Bitmap压缩

Android View截屏长图拼接&#xff08;RecyclerView&#xff09; 我们在实际使用中&#xff0c;往往图片转化成Bitmap&#xff0c;对Bitmap操作的时候&#xff08;如:截屏分享等&#xff09;&#xff0c;可能Bitmap会过大&#xff0c;导致无视实现对应功能。那么我们就需要对B…...

不同子网络中的通信过程

从输入www.baidu.com经历了什么 一、DNS&#xff08;网址->IP&#xff09; 二、ARP&#xff08;IP->MAC&#xff09; A->B&#xff1a;有数据发送&#xff0c;数据封装ip之后发现没有主机B的mac地址。然后ARP在本网段广播&#xff1a;检查目标地址和源地址是否在同一…...

Ubuntu Touch OTA-2 推出,支持 Fairphone 3 和 F(x)tec Pro1 X

导读UBports 基金会近日宣布为基于 Ubuntu 20.04 LTS (Focal Fossa) 的 Ubuntu Touch 移动操作系统发布并全面提供 OTA-2 软件更新。 Ubuntu Touch OTA-2 在首次 OTA 更新整整四个月后发布&#xff0c;支持新设备&#xff0c;包括 Fairphone 3、F(x)tec Pro1 X 和 Vollaphone X…...

电源管理入门-5 arm-scmi和mailbox核间通信

上篇介绍了电源管理入门-4子系统reset&#xff0c;提到子系统reset的执行为了安全可以到SCP里面去执行&#xff0c;但是怎么把这个消息传递过去呢&#xff0c;答案就是mailbox。Mailbox是核间通信软硬件的统称。在软件上可以使用SCMI协议共享内存报文头&#xff0c;在硬件上可以…...

【回归儿童本位,重构专业底色】学前教育行业的深度思辨与价值坚守(二)

吕坤阳亲笔二、行业高质量发展的核心&#xff1a;回归儿童&#xff0c;摒弃功利化教育随着学前教育普惠政策的推进&#xff0c;行业规范化程度不断提升&#xff0c;但功利化、形式化的教育倾向依然存在&#xff0c;成为高质量发展的阻碍。部分幼儿园为迎合家长“抢跑”需求&…...

Allegro PCB设计必备:3分钟搞定带钻孔数据的DXF文件导出(附常见错误排查)

Allegro PCB设计实战&#xff1a;高效导出带钻孔数据的DXF文件全攻略 在PCB设计领域&#xff0c;Allegro作为行业标杆工具&#xff0c;其文件输出质量直接关系到生产制造的准确性。特别是当设计需要与其他CAD系统协作或提交给PCB制造商时&#xff0c;DXF文件的完整性至关重要。…...

像素皇城·灵蛇贺岁实战案例:高校AI课程中像素春联生成器教学项目设计

像素皇城灵蛇贺岁实战案例&#xff1a;高校AI课程中像素春联生成器教学项目设计 1. 项目背景与教学价值 在高校AI课程教学中&#xff0c;如何将传统文化与现代技术相结合&#xff0c;设计出既有教育意义又富有趣味性的实践项目&#xff0c;一直是教学设计的难点。"像素皇…...

OpenRocket:革新性全流程火箭设计的开源技术突破实践

OpenRocket&#xff1a;革新性全流程火箭设计的开源技术突破实践 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket OpenRocket作为一款基于Java开发的开源火…...

Qwen3-TTS-Tokenizer-12Hz快速上手:Web界面一键处理音频文件

Qwen3-TTS-Tokenizer-12Hz快速上手&#xff1a;Web界面一键处理音频文件 1. 为什么选择Qwen3-TTS-Tokenizer-12Hz&#xff1f; 想象一下&#xff0c;你正在开发一个语音社交应用&#xff0c;用户上传的音频文件体积大、传输慢&#xff0c;服务器存储成本居高不下。传统压缩算…...

Qwen3-0.6B应用案例:如何用它快速生成文案和邮件回复

Qwen3-0.6B应用案例&#xff1a;如何用它快速生成文案和邮件回复 1. 引言&#xff1a;轻量级AI写作助手 在日常工作中&#xff0c;我们经常需要处理大量文字工作&#xff1a;撰写产品介绍、回复客户邮件、编写营销文案等。这些任务虽然不复杂&#xff0c;但耗时耗力。Qwen3-0…...

Vivado平台下PCIe IP核选型指南:从硬核到XDMA的实战抉择

1. PCIe技术基础与Vivado开发环境搭建 第一次接触PCIe接口开发时&#xff0c;我被各种专业术语搞得晕头转向。后来才发现&#xff0c;理解PCIe就像理解高速公路系统一样简单。PCIe本质上是一种点对点的高速串行总线&#xff0c;就像城市间修建的多车道高速公路。每个"车道…...

怎样避免网站因 SEO 优化而被搜索引擎惩罚

<h2>怎样避免网站因 SEO 优化而被搜索引擎惩罚</h2> <p>在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了任何网站想要获得流量和提升知名度的关键因素。SEO 优化的过程并不是一帆风顺&#xff0c;特别是在过度优化时&#x…...

【论文】信息系统项目管理师范围管理要点

本资料摘自《科科过论文集分析》&#xff0c;底部附PDF图片版记忆。项目管理中范围管理的六大核心环节&#xff0c;旨在为专业写作提供具体的实践指导与案例素材。文档强调在描述规划、需求收集和范围定义时&#xff0c;应避免枯燥的理论堆砌&#xff0c;转而通过真实的业务场景…...