解决IOS端微信在Iframe框架中无法长按识别二维码
在对麒麟防洪网开发过程中,接到一位顾客,需要给他的微信支付防封,但是发现使用iframe框架后,IOS端无法正常长按二维码进行识别收款,而安卓端却可以正常识别。后面了解到IOS端与安卓端的长按操作是不同的!苹果的长按识别是只支持识别父页面元素,而安卓是通过截图来识别二维码的。所以我们就需要对页面进行改造,但是发现问题还是挺多的~~
首先想到的思路就是长按后,将iframe框架的二维码图片地址传递到父页面展示,而由于防洪的需要,就必须解决跨域传递信息的问题。而易云选择的是postMessage来传递信息,巧妙解决跨域问题,而代码如下:
iframe页面(子页面):
<html> <img id="ewm" src="二维码图片地址"> <script> var btn = document.getElementById("ewm"); longPressFn(btn); function longPressFn (target){ var timer = null; target.addEventListener("touchstart",function(){ window.parent.postMessage(JSON.stringify({state:1,url:'二维码图片地址'}), 'http://父级页面域名'); }); target.addEventListener("touchend",function(){ window.parent.postMessage(JSON.stringify({state:2}), 'http://父级页面域名'); clearTimeout(timer); }); } </script>
父级页面:
<html> <img id="ewm" src="" style="display:none;"> <iframe src="iframe页面地址" frameborder="0" scrolling="auto" width="100%" height="1500px"></iframe> <script> window.addEventListener('message', function(e) { let data = e.data if(typeof data == 'string'){ data = JSON.parse(data) } if(data.state=='1'){//显示二维码 document.getElementById("ewm").style.display="inline"; document.getElementById("ewm").src=data.url; setTimeout(function(){document.getElementById("ewm").style.display="none"; }, 2000); }else{//隐藏二维码 document.getElementById("ewm").style.display="none"; } }, false); </script>
这个方法亲测是可以实现IOS端微信在iframe框架中长按识别二维码,但是问题也是挺多的,比如无法隐藏父级页面显示出的二维码,以及要求二维码位置等,这个需要易云后续慢慢解决。没办法,易云的编程是半桶水(业余爱好),还在边学习边开发中.....