h5实现长按保存图片的功能-利用img
标签
这种方式调起了本地相册。
背景: 抽签成功后,获取对应签的带二维码的图片到本地,用户可以通过扫码带二维码的图片进入活动
技术调研:
- 要调起手机系统相册,还是要借助于原生app,拉起访问系统相册的权限才能实现;
- h5内嵌的不同环境——各种app、浏览器等等暴露的api各不相同,所以要实现的话,要根据不同环境调起不同的桥接api,所以工作量还是较大;
- 最后还是用浏览器默认的自带的功能属性
img
标签长按保存添加图片
- 允许用户在微信上保存图片 所以
img
标签需要加上以下属性
允许
1
2
3
4
5-webkit-user-select: auto;
-moz-user-select: auto;
-khtml-user-select: auto;
-ms-user-select: auto;
user-select: auto;tips:
user-select: auto; => 用户可以选中元素中的内容user-select: none; => 用户不可选中元素中的内容user-select: text; => 用户可以选中元素中的文字禁止——仅支持IE10及以上的高版本浏览器。IE9 以下请使用
onselectstart="return false;"
的方式来实现。1
2
3
4
5
6
7-webkit-user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-ms-user-select: none;
/* 以下两个属性目前并未支持,写在这里为了减少风险 */
-o-user-select: none;
user-select: none;
- 监听
img
标签加载图片完成再执行其他操作1
<img id="img">
1
2
3
4
5
6
7
8
9
10// img标签动态添加
var img=new Image();
img.src=''; // 图片url
img.onload=function(){
console.log('背景图片已加载完毕');
};
// img标签已有
document.querySelector('#img').onload = function() {
console.log('加载完成了);
};
tips:onload 与 ready 的区别是:
- 1、ready 是 DOM 加载完成的事件
- 2、onload 是所有内容加载完成(如:图片)
h5实现长按保存图片的功能-利用a
标签-下载的方式
这种方式只是下载,并没有调起系统相册
1 | function saveImg (url) { |
踩坑1——iPhone11img
标签包裹的图片,微信打开链接长按保存失效,其他手机可以
找问题思路:
- 访问正常的
img
包裹的链接,百度上随便找了一个链接,发现iphone11微信访问是成功的,但是自己的开发的html
页面就是不行。 - 访问自己本地开发的其他有
img
标签的html
页面也可以长按保存图片,但是自己开发的抽签html
页面就是不行。 - 后来怀疑是不是图片
url
格式的影响,就把自己的抽签页面图片url替换正常的html页面的url,发现也不行,果然是url格式的问题。 - 直接为了优化图片,在图片的后缀上加了
?caplist=jpg,webp,avif
这样的后缀,这样可以把jpg
的原始图片尺寸压缩小50%
左右,但是正是因为这个原因,保存图片的格式为webp
的格式,导致微信保存图片失败,去掉这样的后缀就好了。
tips: 在cdn侧判断参数caplist,根据预先定义的优先级,在caplist能够支持图片格式的范围内,返回对应格式的图片内容,若响应了404,则返回次优先级格式图片的内容,直到重试返回图片格式的范围内最低优先级格式的图片内容,若最低优先级格式的图片内容为404,则响应用户为404 HTTP_NOT_FOUND优先级:avif > heic > webp > jpg > png,由图片生产团队提供……