html2canvas 踩坑總結

來源:互聯網
上載者:User

標籤: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 踩坑總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.