欧美激情中文字幕在线_国产区精品视频_免费久久99精品国产自_日韩精品 欧美

JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)截圖導(dǎo)出方案

前言

網(wǎng)頁(yè)截圖導(dǎo)出不是一個(gè)非常高頻的需求,但時(shí)不時(shí)的也會(huì)遇到。這里總結(jié)一下系統(tǒng)的解決方案,然后從中選擇合適自己的。

截圖導(dǎo)出可以看到是兩個(gè)功能,第一步實(shí)現(xiàn)截圖,第二步實(shí)現(xiàn)導(dǎo)出也就是下載能力。

截圖實(shí)現(xiàn)

首先,我們必須明白正常javascript是運(yùn)行在瀏覽器里的,本身沒(méi)有截圖的能力。所以要想實(shí)現(xiàn)截圖,必須通過(guò)其他迂回方案實(shí)現(xiàn),廢話少說(shuō),直接上結(jié)論。

前端方案1 canvas

[dh url="https://html2canvas.hertzen.com/" icon="" des="html2canvas官網(wǎng)"]html2canvas[/dh]

[dh url="https://html2canvas.hertzen.com/" icon="" des="中文文檔"]中文文檔[/dh]

實(shí)現(xiàn)原理:
html2canvas 是一個(gè) HTML 渲染器,屏幕截圖是基于 DOM,因此生成的圖片并不一定 100% 一致,因?yàn)樗鼪](méi)有制作實(shí)際的屏幕截圖,而是根據(jù)頁(yè)面上可用的信息構(gòu)建屏幕截圖。
文檔介紹的比較清楚,canvas只是去還原dom的展示效果。

根據(jù)實(shí)現(xiàn)原理,可以想象,實(shí)現(xiàn)成本還是比較高的,需要解析dom和css樣式,而且css樣式不一定能完美映射到canvas,另外還會(huì)受限于canvas收到的一些限制,比如跨域資源問(wèn)題。

前端方案2 svg

[dh url="https://github.com/tsayen/dom-to-image" icon="" des="html2canvas官網(wǎng)"]dom-to-image[/dh]

[dh url="https://github.com/1904labs/dom-to-image-more" icon="" des="Github"]dom-to-image升級(jí)版[/dh]

實(shí)現(xiàn)原理:

核心要素是SVG 的一個(gè)特性,允許在 <foreignObject> 標(biāo)簽中包含任意的 HTML 內(nèi)容。所以為了渲染該dom節(jié)點(diǎn),需要如下步驟:

  1. 遞歸克隆原始DOM節(jié)點(diǎn)
  2. 計(jì)算節(jié)點(diǎn)和每個(gè)子節(jié)點(diǎn)的樣式并將其復(fù)制到相應(yīng)的克隆,并且要重新創(chuàng)建偽元素,因?yàn)樗鼈儺?dāng)然不會(huì)以任何方式克隆
  3. 嵌入網(wǎng)頁(yè)字體,鏈接所有css樣式到style標(biāo)簽,應(yīng)用到clone節(jié)點(diǎn)
  4. 嵌入圖像
    在 <img> 元素中嵌入圖像 URL
    背景 CSS 屬性中使用的內(nèi)嵌圖像,以類似于字體的方式
  5. 將克隆的節(jié)點(diǎn)序列化為 XML
  6. 將 XML 包裹到 <foreignObject> 標(biāo)簽中,然后包裹到 SVG 中,然后使其成為數(shù)據(jù) URL
  7. 創(chuàng)建一個(gè)以 SVG 作為源的 Image 元素,并將其呈現(xiàn)在您也已創(chuàng)建的離屏畫布上,然后從畫布中讀取內(nèi)容

嗯,這就是svg方式實(shí)現(xiàn)了,和canvas方式一樣,需要我們處理dom,css和資源,但是后續(xù)的繪制渲染工作交給了瀏覽器,所以減輕了很多工作量和代碼量。

服務(wù)端方案

 

[dh url="https://zhaoqize.github.io/puppeteer-api-zh_CN" icon="" des="官方文檔"]Puppeteer [/dh]

Puppeteer 是一個(gè) Node 庫(kù),它提供了一個(gè)高級(jí) API 來(lái)通過(guò) DevTools 協(xié)議控制 Chromium 或 Chrome。這里具體就不介紹了,我們只使用它的截圖功能。

這個(gè)就是真正的截圖能力了,官網(wǎng)有demo。

考慮到業(yè)務(wù)層的頁(yè)面都需要用戶訪問(wèn)權(quán)限,所以正確的步驟應(yīng)該是:

  1. 啟動(dòng)一個(gè)node服務(wù),利用puppeter實(shí)現(xiàn)截圖能力
  2. 客戶端發(fā)起一個(gè)請(qǐng)求,攜帶cookie
  3. 第一步啟動(dòng)的服務(wù)處理此請(qǐng)求,生成圖片,地址返回給客戶端
  4. 客戶端拿到圖片資源,進(jìn)行下載即可

對(duì)比

html2canvas

優(yōu)點(diǎn)

簡(jiǎn)單頁(yè)面截圖效果還可以,兼容性還好

缺點(diǎn)

  • 部分樣式無(wú)法支持
  • 復(fù)雜頁(yè)面,慘不忍睹。
  • cors可以解決跨域,但是實(shí)際應(yīng)用還是問(wèn)題百出
  • 實(shí)現(xiàn)非常復(fù)雜,難以改動(dòng)

在我們項(xiàng)目幾乎無(wú)法使用

dom-to-image

優(yōu)點(diǎn)

  • 實(shí)現(xiàn)簡(jiǎn)單,可下載后自行改動(dòng)源碼
  • 還原度良好,尤其chrome支持非常好

缺點(diǎn)

  • safari支持不是很好,不過(guò)一些問(wèn)題可以解決(canvas節(jié)點(diǎn)會(huì)導(dǎo)出空白,如果使用繪圖引擎的話,建議轉(zhuǎn)化成svg引擎繪圖)
  • ie,edge 無(wú)法使用

基本能支持業(yè)務(wù)需求

后端截圖

優(yōu)點(diǎn)

  • 真實(shí)截圖,終極方案,無(wú)兼容問(wèn)題

缺點(diǎn)

  • 實(shí)現(xiàn)流程稍微繁瑣
  • 需要考慮 用戶權(quán)限認(rèn)證問(wèn)題

導(dǎo)出實(shí)現(xiàn)

導(dǎo)出也就是下載文件到本地

a標(biāo)簽

原理是通過(guò)a標(biāo)簽的download屬性實(shí)現(xiàn)下載。

// 基本使用
<a href="/images/xxxxx.jpg" download="filename">

// 腳本觸發(fā)
const download = (filename, url) => {
    let a = document.createElement('a'); 
    a.style = 'display: none'; // 創(chuàng)建一個(gè)隱藏的a標(biāo)簽
    a.download = filename;
    a.href = url;
    document.body.appendChild(a);
    a.click(); // 觸發(fā)a標(biāo)簽的click事件
    document.body.removeChild(a);
}

blob文件流對(duì)象

這個(gè)需要服務(wù)端支持,發(fā)起請(qǐng)求,服務(wù)端返回?cái)?shù)據(jù)流,然后前端觸發(fā)下載。
具體就不多說(shuō)了,網(wǎng)上有很多文章。

這里推薦幾個(gè)封裝好的下載文件庫(kù)
downloadjs

file-saver
上一篇 flex布局下,div設(shè)置overflow無(wú)效問(wèn)題
下一篇 CorePress主題模仿Mac樣式
目錄
applek

applek管理員

個(gè)人說(shuō)明在個(gè)人中心里面設(shè)置

本月創(chuàng)作熱力圖

最新評(píng)論
小超
小超
7月9日
下個(gè)版本考慮將下載地址加密(防止采集)
Lvtu
Lvtu
7月4日
qiang厲害
評(píng)論于留言建議
chinacnd
chinacnd
6月26日
這個(gè)主題是怎么做到加載速度那么快的?
風(fēng)起云涌
風(fēng)起云涌
6月17日
前臺(tái)投稿現(xiàn)在有點(diǎn)太抽象了 希望可以弄成那種分區(qū)填寫的 標(biāo)題,內(nèi)容,圖片,目錄,標(biāo)簽,這樣的
評(píng)論于留言建議
主站蜘蛛池模板: 午夜精品久久久久久久男人的天堂 | 青青青国产在线观看| 伊人久久大香线蕉精品| 九九精品在线视频| 亚洲国产精品日韩| 久久久久国产精品熟女影院| 日韩欧美一区二| 91av在线精品| 91精品国产91久久| 国产成人精品在线播放| 国产无套内射久久久国产| 久久精品视频免费播放| 日韩人妻精品无码一区二区三区| 91精品网站| 国产日韩欧美夫妻视频在线观看| 欧美极品第一页| 欧美在线视频一二三| 日韩一级片一区二区| 日韩亚洲不卡在线| 日韩精品久久久| 久久亚洲国产成人| 久久精品国产亚洲精品2020| 精品国产第一页| 国产精品视频白浆免费视频| 国产日韩精品一区观看| 国产精选一区二区| 国产精品日韩在线一区| 国产精品视频播放| 高清国产一区| 国产成人精品午夜| 91精品国产成人| 日韩中文字幕在线看| 日韩一区二区三区在线播放| 日本一区二区视频| 美日韩精品免费视频| 极品尤物一区二区三区| 国产女人精品视频| 国产成人精品在线播放| 亚洲自拍欧美另类| 日韩中文字幕av在线| 欧美日韩电影在线观看|