需求:将html表格导出为图片,表格可以自己编辑数据,并适配各种屏幕大小。上网搜了下,找到了html2canvas,一开始使用的是最新版0.5.0,最终因为需要支持自定义div编辑框自动换行选择了v0.4.1 - 7.9.2013

开始编辑框使用的是textarea,后来发现textarea不能自适应高度,内容一多就会出现滚动条。这对于要把表格转化成图片的需求来说是没法接受的,于是改为了

div{ word-wrap: break-word; }
<div contenteditable="true"></div>

于是第一个坑出现了,html2canvas0.5不识别‘word-wrap: break-word;' ,内容一多就直接超出了编辑框。。。

google后发现0.4版本支持‘word-wrap: break-word;' ,我也是醉了。当然新版本还是有进步的,比如就不会出现这个问题:IE下border为1px时不显示。

解决方案:

参考链接

改动0.4版本源代码:

function getCSSInt(element, attribute) {
//var val = parseInt(getCSS(element, attribute), 10);
/**
* my-change liyimin
*/
var val = parseFloat(getCSS(element, attribute), 10);
/**
* my-change end
*/
return (isNaN(val)) ? 0 : val; // borders in old IE are throwing 'medium' for demo.html
}

其实上面都是小坑,真正的大坑是html2canvas默认以屏幕的宽为canvas的宽,当需要转化的html超出屏幕范围时就只能转化当前可视部分,

一开始使用0.5版本的时候也找到了一个解决方案,焰尾迭的 使用html2canvas实现浏览器截图

// return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function(canvas) {
// if (typeof(options.onrendered) === "function") {
// log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
// options.onrendered(canvas);
// }
// return canvas;
// });
/**
*my-change liyimin
*/
var width = options.width != null ? options.width : window.innerWidth;
var height = options.height != null ? options.height : window.innerHeight;
return renderDocument(node.ownerDocument, options, width, height, index).then(function(canvas) {
if (typeof(options.onrendered) === "function") {
  log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
  options.onrendered(canvas);
}
return canvas;
});
/**
*my-change end
*/

但是实际使用的时候也是各种问题。比如width和height设大了,渲染出来的canvas总是各种空白部分,设得和需要转化的html一样大又有可能渲染不全,无奈放弃。

查找了两三天终于找到了一个解决方案,就快要放弃了啊。

解决当内容超出屏幕范围无法全部截取问题:

参考链接

<div>
<iframe id="previewIframe" src="/static/html/preview.html" frameborder="0"></iframe>
</div>

将需要转化的html放在preview.html里面,超出多少都无所谓了有木有啊。

最终就是这样:

var $previewIframe=$('#previewIframe');
html2canvas($previewIframe.contents().find('#previewTabelDetail')[0], {
onrendered: function(canvas) {
  var url = canvas.toDataURL();
   $previewIframe.contents().find('body').append($(<img>").attr("src", url));
}
});

本来是打算直接下载图片的,这样:

var $previewIframe=$('#previewIframe');
html2canvas($previewIframe.contents().find('#previewTabelDetail')[0], {
  onrendered: function(canvas) {
  var triggerDownload = $("<a>").attr("href", url).attr("download", "表格.png").appendTo("body");
  triggerDownload[0].click();
  triggerDownload.remove();
}
});

可惜安卓上不支持直接下载base64的图片链接,就改为生成图片让用户自己手动保存。

补充:

其实关于超出屏幕范围的截图没那么麻烦,根本不需要使用iframe,html2canvas之所以获取不到超出部分是因为对象element的父元素宽高不够,也就是说只要将父元素的宽高设为和需要转换为canvas的子元素的宽高一样大就不会出现这个问题啦

html2canvas 踩坑总结的更多相关文章

  1. html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示

    1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...

  2. html2canvas的踩坑之路

    html2canvas的踩坑之路 前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品 ...

  3. html2canvas以及domtoimage的使用踩坑总结

    前言 首先做个自我介绍,我是成都某企业的一名刚刚入行约一年的前端,在之前的开发过程中,遇到了问题,也解决了问题,但是在下一次解决相同问题的时候,只对这个问题有一丝丝的印象,还需要从新去查找,于是,我注 ...

  4. web前端生成图片之探索踩坑

    前段时间,产品和运营整了个非常变态的需求,要求将一个活动页面输出为图片,然后用户进行分享 开始以为是用户自己手动截图分享,没想到后来不是,细思极恐,感叹需求之变态. 从网上找了N个方案,最后确定使用  ...

  5. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  6. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  7. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~

    这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...

  8. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  9. 我的微信小程序入门踩坑之旅

    前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...

随机推荐

  1. git filename to long问题解决

    在.git/config 下面编辑 [core] longpaths = true

  2. 利用Retrofit, RxJava获取网络内容

    Retrofit & RxJava 关于如何使用Retrofit和RxJava请阅读参考中的两篇文章. Retrofit处理数据 Retrofit是在什么时候处理从网络中获取到的json数据的 ...

  3. NuMicro Coretex™-M0家族中哪种芯片支持UID (Unique ID)? 用户该怎么做才能对其芯片进行加密功能?

    http://www.nuvoton.com/hq/chs/productfaqs/Pages/00000001.aspx 是的,使用者可利用UID来对以下系列芯片进行加密, Mini51 Serie ...

  4. cocos2d-x如何新建一个模板项目

    方法一: $ cd cocos2d-x$ ./setup.py$ source FILE_TO_SAVE_SYSTEM_VARIABLE$ cocos new MyGame -p com.your_c ...

  5. Codeforces Round #221 (Div. 1) B. Maximum Submatrix 2 dp排序

    B. Maximum Submatrix 2 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...

  6. bzoj 1026 [SCOI2009]windy数 数位dp

    1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  7. JLayer初体验。。

    Java最近推出的JLayer虽然和sharped window or translucent window一起有位JavaFX的开发做准备之嫌,但是试了一下还是感觉不错滴.. JLayer 和 gl ...

  8. Java虚拟机的启动与程序的执行

    这篇文章是从 OpenJDK 源码的角度讲当我们执行了 java -classpath . hello 之后,java.exe 怎样从 main 函数開始运行,启动虚拟机,并运行字节码中的代码. 实验 ...

  9. 大话设计模式C++实现-第22章-桥接模式

    一.UML图 二.概念 桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化. 三.说明 为什么叫"桥接模式"? 如上所看到的的UML图中,有一个聚合线, ...

  10. 仿Android网易新闻客户端,并增加水平图片滑动,改进阅读体验

    仿网易新闻Android端APP 主要功能展示和代码实现 差不多花了一周的时间,目前实现的了新闻下的包括头条.体育.娱乐的一系列的新闻展示,以及点击后进入的新闻详情展示. 目前效果 目前效果请访问该网 ...