解决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.Encode手动解码技巧
Jul 14 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
Jun 05 Javascript
BootStrap无限级分类(无限极分类封装版)
Aug 26 Javascript
微信小程序 wxapp内容组件 progress详细介绍
Oct 31 Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
Dec 06 Javascript
将Sublime Text 3 添加到右键中的简单方法
Dec 12 Javascript
Vue瀑布流插件的使用示例
Sep 19 Javascript
使用vuex解决刷新页面state数据消失的问题记录
May 08 Javascript
简述vue-cli中chainWebpack的使用方法
Jul 30 Javascript
vue路由权限校验功能的实现代码
Jun 07 Javascript
微信小程序实现canvas分享朋友圈海报
Jun 21 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
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
jQuery 1.0.2
2006/10/11 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
用Python抢过年的火车票附源码
2015/12/07 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
python matlibplot绘制3D图形
2018/07/02 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
python实现图片转字符画的完整代码
2021/02/21 Python
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
学生保证书范文
2014/04/28 职场文书
主持人演讲稿
2014/05/13 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
Golang日志包的使用
2022/04/20 Golang
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers