解决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 相关文章推荐
左侧是表头的JS表格控件(自写,网上没有的)
Jun 04 Javascript
IE8下String的Trim()方法失效的解决方法
Nov 08 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
AngularJS $injector 依赖注入详解
Sep 14 Javascript
AngularJS bootstrap启动详解及实例代码
Sep 14 Javascript
JS版微信6.0分享接口用法分析
Oct 13 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
Dec 01 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
JS对象的深度克隆方法示例
Mar 16 Javascript
vue proxyTable 接口跨域请求调试的示例
Sep 12 Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
Apr 15 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
php中的数组操作函数整理
2008/08/18 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
php动态函数调用方法
2015/05/21 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
js中获取事件对象的方法小结
2011/03/13 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
js+html5实现canvas绘制镂空字体文本的方法
2015/06/05 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
一百行JS代码实现一个校验工具
2019/04/30 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
为Python程序添加图形化界面的教程
2015/04/29 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
高中毕业自我鉴定
2013/12/19 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
公务员检讨书
2014/11/01 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android
使用Python拟合函数曲线
2022/04/14 Python
Python数组变形的几种实现方法
2022/05/30 Python
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android