解决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 无法通过W3C验证的处理方法
Mar 09 Javascript
jQuery.ajax 用户登录验证代码
Oct 29 Javascript
jquery实现未经美化的简洁TAB菜单效果
Aug 28 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
Nov 30 Javascript
如何动态加载外部Javascript文件
Dec 02 Javascript
给before和after伪元素设置js效果的方法
Dec 04 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
Sep 28 Javascript
微信小程序倒计时功能实现代码
Nov 09 Javascript
AngularJS实现自定义指令及指令配置项的方法
Nov 20 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
Mar 07 Javascript
微信小程序实现手指触摸画板
Jul 09 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技巧与注意事项分析
2011/02/03 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
js加解密 脚本解密
2008/02/22 Javascript
简单的js分页脚本
2009/05/21 Javascript
jquery 表单进行客户端验证demo
2009/08/24 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
python遍历数组的方法小结
2015/04/30 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
python实现扫描ip地址的小程序
2019/04/16 Python
python3对接mysql数据库实例详解
2019/04/30 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
python实现复制文件到指定目录
2019/10/16 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
一份全面的PHP面试问题考卷
2012/07/15 面试题
优乐美广告词
2014/03/14 职场文书
法制报告会主持词
2014/04/02 职场文书
作风转变心得体会
2014/09/02 职场文书
发票退票证明
2015/06/24 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电