解决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
Nov 25 Javascript
用javascript编写的第一人称射击游戏
Feb 25 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
May 23 Javascript
Google (Local) Search API的简单使用介绍
Nov 28 Javascript
js浏览器本地存储store.js介绍及应用
May 13 Javascript
浅谈jquery的map()和each()方法
Jun 12 Javascript
浅谈js内置对象Math的属性和方法(推荐)
Sep 19 Javascript
jQuery用FormData实现文件上传的方法
Nov 21 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
浅谈super-vuex使用体验
Jun 25 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 Javascript
JS实现可控制的进度条
Mar 25 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 随机生成10位字符代码
2009/03/26 PHP
php 读取文件乱码问题
2010/02/20 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
PHP5.2下preg_replace函数的问题
2015/05/08 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
python动态监控日志内容的示例
2014/02/16 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
python 用下标截取字符串的实例
2018/12/25 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
公司年会主持词
2014/03/22 职场文书
分家协议书
2014/04/21 职场文书
产品设计开发计划书
2014/05/07 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
元旦晚会开场白
2015/05/29 职场文书
学校隐患排查制度
2015/08/05 职场文书