文章目录
问题描述
qrcode生成的二维码,在苹果等手机上长按可识别,在华为手机上长按没有反应,截图保存下来长按又可以识别。
-
问题原因
浏览器兼容问题
qrcode在页面生成二维码时,会生成一个canvas标签和一个img标签。在电脑浏览器上调试的时候,发现生成二维码之后canvas标签是会自动隐藏的,然后展示img标签,我们看到和识别的其实是图片。但是在华为手机上生成的canvas是不会隐藏的,我们看到的是canvas,所以无法识别,截图却可以。 -
解决办法
手动将canvas隐藏,获取生成的链接拼到图片里面。
html页面:
<!--用于存放canvas,隐藏-->
<div id="QRCodeNone" style="width:54%;height:200px;margin:8% 0 8% 23%;display:none;">
</div>
<!--用于存放二维码图片-->
<div id="QRCode" style="width:54%;height:200px;margin:8% 0 8% 23%;">
</div>
js
function makeQRCode() {
var qrcode = new QRCode(document.getElementById("QRCodeNone"), {
text: params,//二维码数据
width: 200,
height: 200
});
//在小米或者华为手机上生成的二维码是通过canvas展示的,img标签被隐藏,所以需要特殊处理一下,将canvas标签隐藏,拿到生成的url放到img里面再展示出来
var myCanvas = document.getElementsByTagName('canvas')[0];
var img = convertCanvasToImage(myCanvas);
$("#QRCode").append(img);
};
//将canvas返回的图片添加到image里
function convertCanvasToImage(canvas){
var image = new Image();
image.src = canvas.toDataURL("image/png");
return image;
}
toDataURL语法
canvas.toDataURL(type, encoderOptions);
返回一个包含图片展示的 data URI
参数
type 可选
图片格式,默认为image/png
encoderOptions 可选
图片质量。取值范围为0到1。如果指定图片格式为image/jpeg或image/webp。如果超出取值范围,将会使用默认值0.92。其他参数会被忽略。
返回值
包含dataURI的DOMString。
DataURI格式:data:[][;base64],。其中mediatype声明了文件类型,遵循MIME规则,如“image/png”、“text/plain”;之后是编码类型,这里我们只涉及 base64;紧接着就是文件编码后的内容了。
原文链接:https://blog.csdn.net/weixin_40970987/article/details/94393259
自己验证
<body>
<div class="alert alert-warning" style="padding: 10px 0;">
<h1 class="text-center" style="font-size: 50px;">访客身份二维码</h1>
</div>
<div class="container-fluid">
<div id="QRCodeNone" style="width: 550px;height:550px;margin: 0 auto;"></div>
<div id="qrcode" style="width: 550px;height:550px;margin: 0 auto;">
</div>
<h2 class="text-center" style="font-size: 50px;">恭喜您,信息登记成功!</h2>
<h2 class="text-danger text-center" style="margin-top: 20px;">
<strong>温馨提示:此二维码是您出入厂区的身份证明,请保存至手机相册!</strong>
</h2>
<script>
(function () {
var authUrl = '${authUrl}';
var qrcode = new QRCode('QRCodeNone', {
text: authUrl,
width: 550,
height: 550,
colorDark: '#04ad28',
colorLight: '#ffffff',
correctLevel: QRCode.CorrectLevel.H
}
);
//原文链接:https://blog.csdn.net/weixin_40970987/article/details/94393259
//在小米或者华为手机上生成的二维码是通过canvas展示的,img标签被隐藏,所以需要特殊处理一下,将canvas标签隐藏,拿到生成的url放到img里面再展示出来
var myCanvas = document.getElementsByTagName('canvas')[0];
var img = convertCanvasToImage(myCanvas);
$("#qrcode").append(img);
$("#QRCodeNone").remove();
//将canvas返回的图片添加到image里
function convertCanvasToImage(canvas){
var image = new Image();
image.src = canvas.toDataURL("image/png");
return image;
}
}
)();
</script>
</body>
完