解决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表单验证代码
Aug 02 Javascript
Dom在ajax技术中的作用说明
Oct 25 Javascript
最常用的12种设计模式小结
Aug 09 Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 Javascript
解决ueditor jquery javascript 取值问题
Dec 30 Javascript
vue.js指令v-model实现方法
Dec 05 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
webpack4.x开发环境配置详解
Aug 04 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
Jun 19 jQuery
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
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
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
Python找出list中最常出现元素的方法
2016/06/14 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
易程科技软件测试笔试
2013/03/24 面试题
应届生求职推荐信
2013/10/28 职场文书
小学敬老月活动方案
2014/02/11 职场文书
高校教师岗位职责
2014/03/18 职场文书
元旦寄语大全
2014/04/10 职场文书
2015银行年终工作总结范文
2015/05/26 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python