解决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 相关文章推荐
JavaScript中的变量声明早于赋值分析
Mar 01 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
Apr 04 Javascript
一个简单的全屏图片上下打开显示网页效果示例
Jul 08 Javascript
javascript从image转换为base64位编码的String
Jul 29 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
Jul 29 Javascript
JS实现自动变化的导航菜单效果代码
Sep 09 Javascript
BootStrap中的Fontawesome 图标
May 25 Javascript
node通过express搭建自己的服务器
Sep 30 Javascript
浅谈mint-ui loadmore组件注意的问题
Nov 08 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
Jan 18 jQuery
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
ES6基础之数组和对象的拓展实例详解
Aug 22 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
php创建多级目录代码
2008/06/05 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
php依赖注入知识点详解
2019/09/23 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
初学Python实用技巧两则
2014/08/29 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
kafka-python批量发送数据的实例
2018/12/27 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
巴基斯坦购物网站:Goto
2019/03/11 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
项目经理任命书内容
2014/06/06 职场文书
同意报考证明
2015/06/17 职场文书
外科护士长工作总结
2015/08/12 职场文书