起因:
由于雲栖大會項目需要支援 名片儲存到本地功能【如下圖紅框】,是以,需要單獨截取頁面中的名片資訊,并且儲存到本地。
推薦給:需要擷取頁面内容,給頁面截圖的小夥伴
介紹兩個工具:
html2canvas
官方位址:https://github.com/niklasvh/html2canvas
優點:
1.使用人數多,資料更全
缺點:
1.感覺不怎麼維護更新了
domtoimage
官方位址【github例子很全了】:https://github.com/tsayen/dom-to-image
優點:
1.有人維護
2.git活躍,作者發言
3.使用友善
缺點:
1.新控件,使用人數少,資料不全
2.IOS手機不能截圖,污染了canvas.toDataURL會報錯【目前還沒解決】(參考連結:https://github.com/tsayen/dom-to-image/issues/40)
報錯資訊如下:"SECURITY_ERR: DOM Exception 18: The operation is insecure"
修改dom-to-image.js源碼如下:
[javascript] view plain copy
- //IOS相容
- function toPng(node, options) {
- return draw(node, options || {})
- .then(function(result) {
- try {
- // 原來的
- var image = result.canvas.toDataURL("image/png", 1.0);
- return image;
- // 改為svg更清楚
- // console.log(result.svg.src);
- // return result.svg.src;
- } catch (err) {
- console.warn(err);
- // alert(result.svg.src);
- // console.log(result.svg.src);
- return "error";
- }
- });
- }
最終方案選擇:
參考了很多資料,最後決定IOS使用html2canvas ,Android使用domtoimage
代碼:
[javascript] view plain copy
- // 裁剪名片
- cropCard() {
- let self = this;
- // 擷取dom結構
- let card_target = this.refs.copyCardArea;
- domtoimage.toPng(card_target).then(function(dataUrl) {
- //andriod
- if (dataUrl != "error") {
- // alert("domtoimage");
- self.setState({
- imgUrl: dataUrl,
- isDownloadImg: true,
- })
- }
- // ios
- else {
- let b64;
- html2canvas(card_target, {
- useCORS: true
- }).then(function(canvas) {
- try {
- b64 = canvas.toDataURL("image/png");
- } catch (err) {
- console.log(err)
- // alert(err)
- }
- self.setState({
- imgUrl: b64,
- isDownloadImg: true,
- })
- }).catch(function onRejected(error) {});
- }
- });
- }
手機淘寶相容:
手淘禁止了,使用者使用截圖,推薦使用官方JSBridge
WindVane連結:http://h5.alibaba-inc.com/api/WindVane-API.html
方法:WVScreen.capture
缺點:
1.隻能截取整個螢幕,不能隻擷取名片資訊
2.不知道是不是react的原因,直接使用,會有部分情況截取到灰色蒙版的效果,是以延遲300毫秒截圖
引入:
[javascript] view plain copy
- <script src="//g.alicdn.com/mtb/lib-windvane/2.1.8/windvane.js"></script>
代碼:
[javascript] view plain copy
- window.setTimeout(() => {
- this.taobaoCapture();
- }, 300);
[javascript] view plain copy
- taobaoCapture() {
- let self = this;
- var params = {
- // 是否将截屏結果儲存一份到相冊中
- inAlbum: 'true'
- };
- window.WindVane.call('WVScreen', 'capture', params, function(e) {
- // alert('success: ' + JSON.stringify(e));
- // 截圖成功提示話語
- self.setState({
- isTips: true,
- line1: tipWords.saveCardS.line1,
- line2: tipWords.saveCardS.line2,
- });
- }, function(e) {
- // alert('failure: ' + JSON.stringify(e));
- // 截圖失敗提示話語
- self.setState({
- isTips: true,
- line1: tipWords.saveCardF.line1,
- line2: tipWords.saveCardF.line2,
- });
- });
- }
寫在最後:
domtoimage 和 html2canvas截圖PNG格式,都會損失部分圖檔精度,使圖檔變模糊。
如果不是在移動端的話,建議使用SVG格式,更為清晰。
兩個插件個人更喜歡 domtoimage ~
DEMO:
https://codepen.io/CandyQiu/pen/XzmGNL?editors=0010
轉載:http://blog.csdn.net/candy_home/article/details/78424642