微信长按识别二维码 -- 页面多个二维码如何识别?

常规的在公众号html页面中要实现长按识别二维码,直接使用img显示图片就可以了,如下:

<img name="qrCodeImg" src="/images/itlao5.jpg" style="width: 80%;" />

然而,当同一个页面有多个二维码时,会出现怎样的情况呢?

今天碰到的需求中就在同一个页面有三个二维码,按照上面的方法,写了三个img,长按不同二维码img打开不同的公众号或小程序。然而,实际的效果与想象中的有点差别:在部分手机上,不管长按哪个img,都是识别了第一个img,试了三台手机,除了华为P20正常,VIVO和华为X5都出现该问题,后来测试P20在部分情况下也有该问题。
不知道怎么回事,网上一顿搜索,说是二维码识别功能是先截屏然后在识别截取的图片,然后结合我P20正常的情况,应该是截取了点击位置附近一定像素的屏幕,然后进行识别。如果该截屏区域内有多个二维码,会识别到第一个,这就造成了同一屏内多个二维码识别出错的问题。

然后想解决思路,方案有三种:

  1. 二维码间隔拉大,保证同一屏内只显示一个完整的二维码;
  2. 先弄个二维码列表(不用img,用background放图片),然后点击二维码打开详情页(或者弹出层) ,长按详情页或弹出层img识别
  3. 既然是截屏识别第一个完整二维码,那在截屏时将点击的img图片显示到顶部,是否可以实现想要的功能。

方案1和方案2毕竟在用户体验上不怎么好,只作为备用方案,我们重点看方案3:整体思路是这样的,在顶部加一个临时img,用于显示当前长按的二维码。然后监听所有img的touch事件,当按下去时,延时300ms显示图片(延迟300ms是为了防止该touch是滑动事件,而不是长按事件),如果移动了则不再显示,然后touch事件结束后也隐藏图片;另外,在长按时,html中是无法触发touchend事件的,因为被手机原生事件截断,所以需要监听touchcancel事件,该事件触发时也隐藏图片。需要注意的是,因为长按后微信需要截屏,所以隐藏事件需要延时500~1000ms。

实际效果如下:

长按识别多个二维码.gif

以下是js和html核心代码:

    <script type="text/javascript">
        function load() {
            var imgs = document.getElementsByName("qrCodeImg");
            for (var i = 0; i < imgs.length; i++) {
                imgs[i].addEventListener("touchstart", touchstart, false);
                imgs[i].addEventListener("touchend", touchend, false);
                imgs[i].addEventListener("touchmove", touchmove, false);
                imgs[i].addEventListener("touchcancel", touchcancel, false);
            }

            function touchstart(e) {
                showTempQrCodeImg();
            }

            function touchmove(e) {
                dismissTempQrCodeImg();
            }

            function touchend(e) {
                dismissTempQrCodeImg();
            }

            function touchcancel(e) {
                dismissTempQrCodeImg();
            }

            var timeoutId = 0;
            function showTempQrCodeImg() {
                var currentSrc = this.src;
                timeoutId = setTimeout(function () {
                    var oInp2 = document.getElementById("tempQrCodeImg");
                    oInp2.src = currentSrc;
                    oInp2.style.display = 'block';
                    show = true;
                }, 300);
            }

            function dismissTempQrCodeImg() {
                clearTimeout(timeoutId);
                setTimeout(function () {
                    var oInp2 = document.getElementById("tempQrCodeImg");
                    oInp2.src = '';
                    oInp2.style.display = 'none';//ios上光设置src=''无法隐藏图片,需要设置display
                    show = false;
                }, 1000);
            }
            
        }
        window.addEventListener('load', load, false);
    </script>

<!--临时二维码展示img, 注意id为tempQrCodeImg及设置position:fixed;z-index:100;这里设置width: 80%比普通图片大,因为设置太小会造成在ios上第一张图片左右部分识别为不同的二维码-->
<img id="tempQrCodeImg" src="" style="width: 80%; position:fixed; left:10%;z-index:100" />
<!--实际二维码展示img,注意所有的name都是qrCodeImg-->
<img name="qrCodeImg" src="/Content/images/it-lao5.jpg" style="width: 40%;" />

个人博客: IT老五
微信公众号:[IT老五(it-lao5)],一起源创,一起学习!

2019.07.29 15:03 bug修复
后续发现在显示的二维码比较多,滑动后点击中间和底部的二维码会出现识别错误的问题,做下修改,临时二维码加一层div背景(设置颜色与页面背景色一致)

<div id="tempQrCodeImgDiv" style="width:100%;height:100%; position:fixed; display:none;background:#efeff4;z-index:90">
</div>
<img id="tempQrCodeImg" src="" style="width: 80%; position:fixed; left:10%;z-index:100" />

js方法中的oInp2.style.display = 语句后,同时加上对背景div的显示与隐藏操作。


2019.09.30 14:54 bug修复
还是有反馈部分二维码识别错误(主要是二维码显示一半或居于底部时),特别是在iphone x和vivo手机上问题比较明显。因此,又改了下,改为点击图片弹窗,然后再长按识别。
这篇文章太长,所以另开了一篇文章:简书:(补充)微信长按识别二维码 -- 页面多个二维码如何识别?(二)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容