html2canvas与失效的二维码
需求导向
最近做H5活动时,又遇到一个常规的需求,将页面生成一张图片,提示用户长按保存。类似最近看到的微视的一个测试性格的活动。
效果图如下,点击链接可测试,请在微信里打开, 测试链接
实现原理
我们利用html2canvas这个前端库,先将html页面转换成canvas,再通过这个API的回调,调用生成base64的方法,最终将图片赋值给img标签的src属性。
代码实现
1.html2canvas转换成base64
这里需要注意,html2canvas入参必须要原生JS的DOM对象
function bodyToImg() {
// 转换成图片
html2canvas(document.querySelector('#body')).then(canvas => {
const dataURL = canvas.toDataURL('image/jpeg');
$('#bodyImg').attr('src', dataURL);
$('#bodyImg').show();
$('#body').hide();
2.获取二维码图片
const url = 'xxx';
let imgUrl = `${window.location.origin}/getQRCode.action?width=129&height=129&url=${url}`;
convertImgToBase64(imgUrl, function (base64) {
qrCode[0].src = base64;
qrCode[0].onload = function () {
validateImages();
function validateImages() {
let time = setInterval(function () {
if (qrCode[0].complete) {
clearInterval(time);
bodyToImg();
}, 300);
setTimeout(function () {
clearInterval(time);
}, 30 * 1000);
function convertImgToBase64(url, callback, outputFormat) {
let canvas = document.createElement('CANVAS');
let ctx = canvas.getContext('2d');
let img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function () {
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img, 0, 0);
var dataURL = canvas.toDataURL(outputFormat || 'image/png');