標籤:com href 問題: 自適應高度 5.0 promise 開始 不顯示 多少
需求:將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的圖片連結,就改為產生圖片讓使用者自己手動儲存。
html2canvas 踩坑總結