QRPress 二维码长按兼容工具
GB.QRPress 用于改善微信 iOS 环境中,二维码图片经过 transform 等布局处理后无法正常长按识别的问题。长按目标时,它会临时复制二维码图片到独立遮罩层,为微信原生长按菜单提供可识别的图片节点。
安装与引入
浏览器直接引入
<script src="https://cloud.m775.net/js/qrpress.js"></script>
npm 项目
npm i @gentbo/qrpress
import '@gentbo/qrpress';
快速开始
默认监听带有 data-qrcode 属性的元素。目标可以是图片本身,也可以是内部包含图片的容器。
<div class="qr-card" data-qrcode>
<img src="qrcode.png" alt="扫码访问">
</div>
<script>
GB.QRPress()
.class('qr-overlay')
.delay(350)
.slide(10)
.start();
</script>
配置遮罩样式
工具只负责创建遮罩、复制图片并设置图片尺寸,遮罩的位置、层级和视觉效果需要由页面 CSS 控制。
.qr-overlay {
position: fixed;
z-index: 9999;
inset: 50% auto auto 50%;
transform: translate(-50%, -50%);
background: #fff;
}
.qr-overlay img {
display: block;
}
遮罩宽高会自动使用原二维码图片的实际显示尺寸。遮罩图片会设置为不可拖拽,并在触摸结束约 300ms 后移除。
API 速查
GB.QRPress(selector?)创建监听器;默认选择器为 [data-qrcode]。.class(name)设置临时遮罩层类名,默认 qr-overlay。.delay(ms)设置触发长按的等待时间,默认 350ms,只接受正数。.slide(px = 10)设置取消长按的移动阈值,默认 10px,只接受正数。.start()在 document 上注册触摸监听并开始工作。.run()start() 的兼容入口。使用自定义选择器
GB.QRPress('.wechat-qrcode')
.class('wechat-qr-overlay')
.delay(500)
.slide(16)
.start();
事件采用委托方式注册在 document 上,因此启动后动态加入页面、且匹配选择器的二维码也可以工作。
使用边界
触摸环境监听 touchstart、touchmove、touchend 和 touchcancel,桌面鼠标长按不会触发。目标结构匹配元素不是 img 时,会查找其内部的第一个 img;没有图片则不执行。重复启动start() 没有重复调用保护;同一实例或多个实例重复启动会增加 document 监听器。生命周期当前 API 没有停止或销毁方法,建议每个页面只初始化一次。