js實(shí)現(xiàn)截圖保存圖片功能的代碼示例
前幾天公司項(xiàng)目里有這樣一個(gè)需求,把網(wǎng)頁(yè)的某一部分能夠一鍵截圖。這個(gè)功能其實(shí)就是對(duì)人力的一個(gè)優(yōu)化,如果是人為做的話,相信大家都知道怎么做(用截圖工具在指定區(qū)域截圖,然后保存到本地,再上傳的服務(wù)器上去)。我這個(gè)主要就解決這個(gè)批量的人力的優(yōu)化。好,廢話不多說(shuō)了。直接上邏輯和代碼。'
這個(gè)問(wèn)題的解決方案:html to canvas to png. 目前有一個(gè)這樣的插件: html2canvas,
html2canvas($targetElem, { useCORS: true, onrendered: function(canvas) { } });
這個(gè)'$targetElem'就是那個(gè)要轉(zhuǎn)換的html, useCORS 用來(lái)設(shè)置圖片是否跨域(如html圖片域名和當(dāng)前網(wǎng)站不是同一個(gè)域名,需要設(shè)置這個(gè)屬性), onrendered 是轉(zhuǎn)換完成后執(zhí)行的方法。
里面有一種情況需要考慮:如果html標(biāo)簽里有svg標(biāo)簽, 目前htm2canvas不支持svg標(biāo)簽。
這個(gè)情況下就需要先把svg處理成html2canvas能處理標(biāo)簽。
我這策略是 svg 轉(zhuǎn)換成 canvas ,html2canvas 轉(zhuǎn)換完成,再回復(fù)svg。這里我還需要這個(gè)插件canvg(svg轉(zhuǎn)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轉(zhuǎn)換成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); //回復(fù)svg nodesToRemove.forEach(function(pair) { pair.parent.removeChild(pair.child); }); nodesToRecover.forEach(function(pair) { pair.parent.appendChild(pair.child); }); })
這個(gè)方案,我已經(jīng)完全實(shí)現(xiàn)了,并在我們項(xiàng)目里使用了。歡迎大家使用,如果有什么問(wèn)題,可以留言給我。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript 格式化數(shù)字、金額、千分位、保留幾位小數(shù)、舍入舍去
這篇文章主要介紹了JavaScript 格式化數(shù)字、金額、千分位、保留幾位小數(shù)、舍入舍去,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07el-table動(dòng)態(tài)渲染列、可編輯單元格、虛擬無(wú)縫滾動(dòng)的實(shí)現(xiàn)
vue對(duì)數(shù)據(jù)處理很常見,本文主要介紹了對(duì)el-table組件二次封裝,包括對(duì)el-table的動(dòng)態(tài)渲染、單元格編輯;對(duì)于無(wú)縫滾動(dòng)的實(shí)現(xiàn),優(yōu)化大數(shù)據(jù)量下的頁(yè)面卡頓問(wèn)題,感興趣的可以了解一下2023-12-12關(guān)于function類中定義變量this的簡(jiǎn)單說(shuō)明
下面小編就為大家?guī)?lái)一篇關(guān)于function類中定義變量this的簡(jiǎn)單說(shuō)明。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05原生JavaScript再網(wǎng)頁(yè)實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音功能
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)原生JavaScript再網(wǎng)頁(yè)實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-03-03javascript點(diǎn)擊按鈕實(shí)現(xiàn)隱藏顯示切換效果
這篇文章主要介紹了javascript點(diǎn)擊按鈕實(shí)現(xiàn)隱藏顯示切換效果,以一個(gè)完整的實(shí)例為大家分析了js點(diǎn)擊按鈕實(shí)現(xiàn)隱藏顯示切換的功能,感興趣的小伙伴們可以參考一下2016-02-02js使用DOM操作實(shí)現(xiàn)簡(jiǎn)單留言板的方法
這篇文章主要介紹了js使用DOM操作實(shí)現(xiàn)簡(jiǎn)單留言板的方法,涉及javascript中DOM操作的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04js中eval()函數(shù)和trim()去掉字符串左右空格應(yīng)用
對(duì)于js中eval()函數(shù)的理解和寫一個(gè)函數(shù)trim()去掉字符串左右空格;對(duì)于js中eval()函數(shù)的理解是本人心得不一定正確,感興趣的朋友參考下,或許對(duì)你學(xué)習(xí)eval()函數(shù)有所幫助2013-02-02JS 實(shí)現(xiàn)BASE64_ENCODE和BASE64_DECODE(實(shí)例代碼)
JS 實(shí)現(xiàn)BASE64_ENCODE和BASE64_DECODE(實(shí)例代碼)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11