前几天公司项目里有这样一个需求,把网页的某一部分可以一键截图。这个功能其实就是对人力的一个优化,若是是人为作的话,相信你们都知道怎么作(用截图工具在指定区域截图,而后保存到本地,再上传的服务器上去)。我这个主要就解决这个批量的人力的优化。好,废话很少说了。直接上逻辑和代码。'html
这个问题的解决方案:html to canvas to png.
目前有一个这样的插件: html2canvas,node
html2canvas($targetElem, { useCORS: true, onrendered: function(canvas) { } });
这个'$targetElem'就是那个要转换的html, useCORS 用来设置图片是否跨域(如html图片域名和当前网站不是同一个域名,须要设置这个属性), onrendered 是转换完成后执行的方法。canvas
里面有一种状况须要考虑:若是html标签里有svg标签, 目前htm2canvas不支持svg标签。
这个状况下就须要先把svg处理成html2canvas能处理标签。
我这策略是 svg 转换成 canvas ,html2canvas 转换完成,再回复svg。这里我还须要这个插件canvg(svg转canvas)
具体代码以下跨域
var nodesToRecover = []; var nodesToRemove = []; var $svgElem = $targetElem.find('svg'); $svgElem.each(function(index, node) { var parentNode = node.parentNode; var canvas = document.createElement('canvas'); canvg(canvas, parentNode, {ignoreMouse: true, ignoreAnimation: true}); //将svg转换成canvas nodesToRecover.push({ parent: parentNode, child: node }); parentNode.removeChild(node); nodesToRemove.push({ parent: parentNode, child: canvas }); parentNode.appendChild(canvas); }); html2canvas($targetElem, { useCORS: true, onrendered: function(canvas) { var base64Image = canvas.toDataURL('image/png').substring(22); //回复svg nodesToRemove.forEach(function(pair) { pair.parent.removeChild(pair.child); }); nodesToRecover.forEach(function(pair) { pair.parent.appendChild(pair.child); }); })
这个方案,我已经彻底实现了,并在咱们项目里使用了。 欢迎你们使用,若是有什么问题,能够留言给我。服务器
最后但愿你们若是以为好,给个推荐。app
欢迎关注小站小滑轮,小站都是平时工做中积累的一些小工具。是否是大家工做中也会遇到呢。关于小站的内容也能够在博客下面留言哦。有什么使用的工具想让我补充,也能够留言。svg