解决qrcode.js生成二维码时必须定义一个空div的问题


Posted in Javascript onJuly 09, 2020

根据qrcode的文档说明:https://github.com/davidshimjs/qrcodejs

<div id="qrcode"></div>
<script type="text/javascript">
new QRCode(document.getElementById("qrcode"), "sample text");
// or 
new QRCode(document.getElementById("qrcode"), {
 text: 'sample text',
 width: 200,
 height: 200,
 colorDark: "#000000",
 colorLight: "#ffffff",
 correctLevel: QRCode.CorrectLevel.H
});

要有一个元素存放二维码,

可以看到这个div中被追加了canvas,img两个标签。

但是我想不想创建这个div啊。然后我就找到了node-qrcode

他有两种用法:

<html>
 <body>
 <canvas id="canvas"></canvas>
 <script src="bundle.js"></script> 
 </body>
</html>
<script>
 var QRCode = require('qrcode')
 var canvas = document.getElementById('canvas')
 QRCode.toCanvas(canvas, 'sample text', function (error) {
  if (error) console.error(error)
  console.log('success!');
 })
</script>

很显然这种和前面那个一样,需要先创建一个标签。

var QRCode = require('qrcode')
 
QRCode.toDataURL('I am a pony!', function (err, url) {
 console.log(url)
})

终于找到我想要的了,不过,这里的url是base64,如果二维码过大的话,使用base64进行图片渲染,会导致浏览器崩溃,这个问题后面解决。

那么问题又来了,这个node-qrcode只能用在vue中使用(不能直接在浏览器运行,需要特殊处理),如果想直接使用(或在vue中使用cdn)必须用第一种模式。

这问题有绕回来了。

暂时没有好的方案。自己二次优化一下吧。

既然第一种方案里,有一个img标切,是不是可以读取图片流,然后自己处理?

var div = document.createElement('div');
var size = 200;
var padding = 20;
var bg = '#ffffff';
new QRCode(div, {
 text: val,
 width: size,
 height: size,
 colorDark: "#000000",
 colorLight: bg,
 correctLevel: QRCode.CorrectLevel.H
});
console.log(div.querySelector('img').src);

发现是空的''.
根据以往经验,这里的图片,可能需要时间来渲染?

div.querySelector('img').addEventListener('load', (event) => {
 var img = event.target;
 console.log(img.src); 
})

果然拿到了base64地址。
到此,就已经解决所有问题,剩下的,就是自己画个二维码了(这种方法生成的二维码,没有边距留白,非常丑)

// https://github.com/davidshimjs/qrcodejs
export default {
 imageBase64ToBlob(urlData, type = 'image/jpeg') {
  var ab = null;
  try {
   var arr = urlData.split(',')
   var mime = arr[0].match(/:(.*?);/)[1] || type;
   // 去掉url的头,并转化为byte
   var bytes = window.atob(arr[1]);
   // 处理异常,将ascii码小于0的转换为大于0
   ab = new ArrayBuffer(bytes.length);
   // 生成视图(直接针对内存):8位无符号整数,长度1个字节
   var ia = new Uint8Array(ab);

   for (var i = 0; i < bytes.length; i++) {
    ia[i] = bytes.charCodeAt(i);
   }

   return new Blob([ab], {
    type: mime
   });
  } catch (e) {
   ab = new ArrayBuffer(0);
   return new Blob([ab], {
    type: type,
   });
  }
 },
 createQr(val, back) {
  var div = document.createElement('div');
  var size = 200;
  var padding = 20;
  var bg = '#ffffff';
  new QRCode(div, {
   text: val,
   width: size,
   height: size,
   colorDark: "#000000",
   colorLight: bg,
   correctLevel: QRCode.CorrectLevel.H
  });
  var canvas = div.querySelector('canvas');
  div.querySelector('img').addEventListener('load', (event) => {
   var img = event.target;
   var ctx = canvas.getContext('2d');
   ctx.fillStyle = bg;
   ctx.fillRect(0, 0, size, size);
   // ctx.clearRect(0, 0, size, size);
   ctx.drawImage(img, 0, 0, img.width, img.height, padding, padding, size - 2 * padding, size - 2 * padding);
   let url = canvas.toDataURL();
   back(URL.createObjectURL(this.imageBase64ToBlob(url)))
  })
 }
}

到此这篇关于解决qrcode.js生成二维码时必须定义一个空div的问题的文章就介绍到这了,更多相关qrcode.js二维码定义一个空div内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
firefox事件处理之自动查找event的函数(用于onclick=foo())
Aug 05 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
Jan 11 Javascript
jquery交替变换颜色的三种方法 实例代码
Nov 19 Javascript
node.js中的path.delimiter方法使用说明
Dec 09 Javascript
值得分享的bootstrap table实例
Sep 22 Javascript
详解vuejs之v-for列表渲染
Jun 22 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
Jun 23 jQuery
Angularjs实现上传图片预览功能
Sep 01 Javascript
vue项目移动端实现ip输入框问题
Mar 19 Javascript
实现elementUI表单的全局验证的方法步骤
Apr 29 Javascript
javascript面向对象程序设计实践常用知识点总结
Jul 29 Javascript
React配置子路由的实现
Jun 03 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
Jul 09 #Javascript
jQuery实现B2B网站后台管理系统侧导航
Jul 08 #jQuery
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 #Javascript
Vue作用域插槽实现方法及作用详解
Jul 08 #Javascript
Vue Render函数创建DOM节点代码实例
Jul 08 #Javascript
实例讲解React 组件生命周期
Jul 08 #Javascript
详细分析React 表单与事件
Jul 08 #Javascript
You might like
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
PHP 的 __FILE__ 常量
2007/01/15 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python 编程速成(推荐)
2019/04/15 Python
Python 处理文件的几种方式
2019/08/23 Python
python enumerate内置函数用法总结
2020/01/07 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
送给他或她的礼物:FUN.com
2018/08/17 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
党建工作整改措施
2014/10/28 职场文书
个人先进事迹材料
2014/12/29 职场文书
婚礼父母答谢词
2015/01/04 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
Golang gRPC HTTP协议转换示例
2022/06/16 Golang