JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)截圖功能
使用JavaScript截圖,這里我要推薦兩款開源組件:一個(gè)是Canvas2Image,它可以將Canvas繪圖編程PNG/JPEG/BMP的圖像;但是光有它還不夠,我們需要給任意DOM(至少是絕大部分)截圖,這就需要html2canvas,它可以將DOM對(duì)象轉(zhuǎn)換成一個(gè)canvas對(duì)象。兩者的功能結(jié)合起來(lái),就可以把頁(yè)面上的DOM截圖成PNG或者JPEG圖像了,很酷。
Canvas2Image
它的原理是利用了HTML5的canvas對(duì)象提供了toDataURL()的API:
var strDataURI = oCanvas.toDataURL();
// returns "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACt..."
這樣的結(jié)果是base64編碼的(事實(shí)上,image也可以通過(guò)這種方式以字符串的形式寫死到頁(yè)面上),所以我們還需要一個(gè)base64編解碼的lib。
但是目前的缺陷也有不少,比如目前Opera和Safari只支持PNG,F(xiàn)ireFox的支持性則好得多。
生成圖片有兩種方式寫入頁(yè)面,一種是生成一個(gè)圖片對(duì)象寫入頁(yè)面DOM樹中,這也是支持性比較好的方式:
// returns an <img> element containing the converted PNG image
var oImgPNG = Canvas2Image.saveAsPNG(oCanvas, true);
但是如果你做一個(gè)JavaScript截圖功能的話,你可能希望截圖后能夠自動(dòng)打開保存文件的“保存”對(duì)話框:
Canvas2Image.saveAsPNG(oCanvas);
// will prompt the user to save the image as PNG.
這個(gè)方式調(diào)用會(huì)生成一個(gè)mimeType為“image/octet-stream”的數(shù)據(jù)流到瀏覽器,但是“保存”對(duì)話框無(wú)法識(shí)別出圖片適當(dāng)?shù)暮缶Y名,默認(rèn)保存的文件在FireFox下是“xxx.part”這種名字,這是令人遺憾的地方,但是似乎沒有什么好辦法解決。
html2canvas
它作用于DOM加載的過(guò)程,收集其中的信息,再來(lái)繪制canvas圖像,也就是說(shuō),其實(shí)它并不是將展現(xiàn)的DOM樹截成canvas圖,而是仿照DOM樹重新繪制了一張canvas圖。于是很多CSS樣式都無(wú)法被準(zhǔn)確識(shí)別出來(lái),無(wú)法準(zhǔn)確反映到圖上。
其它的限制還有不少,比如:
●javascript必須是同域的,對(duì)于跨域的情況需要使用代理服務(wù)器(API中有參數(shù)可以指定),對(duì)于image也同樣;
●frame內(nèi)的DOM樹無(wú)法被準(zhǔn)確繪制;
●因?yàn)橐L制的是canvas圖,所以像IE8這樣的瀏覽器需要使用FlashCanvas這樣的第三方庫(kù)。
這個(gè)頁(yè)面可以測(cè)試各個(gè)網(wǎng)站使用它來(lái)截圖的效果,效果相當(dāng)不錯(cuò):
API使用的例子:
html2canvas(
[dom1, dom2],
{
logging: false,
useCORS: false,
proxy: false,
onrendered: function(canvas){
// canvas 就是繪制的canvas是對(duì)象
}
}
);
對(duì)于這一類相對(duì)小眾的類庫(kù),文檔都是很差的,包括API的定義,需要閱讀源碼,代碼上寫得挺清楚的。
另外,該站點(diǎn)下載包里面還有一個(gè)JQuery的插件,對(duì)這個(gè)API做了一個(gè)封裝,可以無(wú)視。
相關(guān)文章
JS實(shí)現(xiàn)自動(dòng)變換的菜單效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)自動(dòng)變換的菜單效果代碼,可實(shí)現(xiàn)自動(dòng)變換菜單選中項(xiàng)的技巧,涉及JavaScript定時(shí)函數(shù)觸發(fā)頁(yè)面樣式屬性變換的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09詳解如何使用JavaScript實(shí)現(xiàn)自定義的雙向數(shù)據(jù)綁定
雙向數(shù)據(jù)綁定是一種編程模式,用于在用戶界面和數(shù)據(jù)模型之間實(shí)現(xiàn)數(shù)據(jù)的同步更新,它允許用戶界面中的數(shù)據(jù)變化自動(dòng)更新到數(shù)據(jù)模型中,在這篇文章中,我會(huì)使用基于觀察者模式和基于Proxy對(duì)象來(lái)實(shí)現(xiàn)JS的自定義雙向數(shù)據(jù)綁定2023-08-08Bootstrap每天必學(xué)之折疊(Collapse)插件
Bootstrap每天必學(xué)之折疊(Collapse)插件,折疊插件可以很容易地讓頁(yè)面區(qū)域折疊起來(lái),感興趣的小伙伴們可以參考一下2016-04-04Javascript實(shí)現(xiàn)頁(yè)面滾動(dòng)時(shí)導(dǎo)航智能定位
本篇文章主要介紹了Javascript實(shí)現(xiàn)頁(yè)面滾動(dòng)時(shí)導(dǎo)航智能定位,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05微信小程序下拉刷新組件加載圖片(三個(gè)小點(diǎn))不顯示刷新狀態(tài)的問(wèn)題
很多朋友跟小編反饋這樣一個(gè)問(wèn)題,微信小程序中列表頁(yè)面下拉刷新 ,頂部不顯示三個(gè)小點(diǎn)的刷新狀態(tài),今天通過(guò)本文給大家介紹下小程序下拉刷新不了的解決方法,感興趣的朋友跟隨小編一起看看吧2022-10-10JS實(shí)現(xiàn)簡(jiǎn)單的tab切換選項(xiàng)卡效果
這篇文章主要介紹了JS實(shí)現(xiàn)簡(jiǎn)單的tab切換選項(xiàng)卡效果,涉及javascript結(jié)合鼠標(biāo)事件對(duì)頁(yè)面元素屬性動(dòng)態(tài)操作的相關(guān)技巧,需要的朋友可以參考下2016-09-09