解决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 jsFiddle JSBin在线调试器
Mar 14 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
Jul 08 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
Mar 18 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
Jun 23 Javascript
理解javascript定时器中的setTimeout与setInterval
Feb 23 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
angular实现spa单页面应用实例
Jul 10 Javascript
浅谈Vue.set实际上是什么
Oct 17 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 Javascript
Vue 禁用浏览器的前进后退操作
Sep 04 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
实用函数2
2007/11/08 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
基于php无限分类的深入理解
2013/06/02 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
jstree的简单实例
2016/12/01 Javascript
javascript history对象详解
2017/02/09 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
vue实现弹幕功能
2019/10/25 Javascript
numpy中的高维数组转置实例
2018/04/17 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
python中如何打包用户自定义模块
2020/09/23 Python
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
单位工程竣工验收方案
2014/03/16 职场文书
大学生工作求职信
2014/06/23 职场文书
社区活动策划方案
2014/08/21 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
社会实践活动总结格式
2015/05/11 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库