JS實(shí)現(xiàn)瀏覽器點(diǎn)擊下載圖片功能案例分析【親測(cè)有效】
點(diǎn)擊下載圖片分兩種:
1、一種是同源地址圖片(也就是本地本項(xiàng)目中的圖片);
2、另一種是不同源的圖片;(不同域名下,比如阿里云 七牛云上的圖片)
下面我們就具體說(shuō)一下這兩種圖片下載的方式:
第一種(同源)下載:
利用a標(biāo)簽下載, a標(biāo)簽有一個(gè)download的屬性,添加了該屬性,a標(biāo)簽將直接下載文件,并根據(jù)download屬性的值設(shè)置下載文件的文件名,不為download屬性設(shè)置值則文件將以默認(rèn)文件名下載:
如:
<!-- 文件名為默認(rèn)名稱 --> <a href="./baidu_jgylogo3.gif" rel="external nofollow" rel="external nofollow" rel="external nofollow" download /> <!-- 文件名為baidu.gif --> <a href="./baidu_jgylogo3.gif" rel="external nofollow" rel="external nofollow" rel="external nofollow" download="baidu" /> <!-- 文件名為baidu.png --> <a href="./baidu_jgylogo3.gif" rel="external nofollow" rel="external nofollow" rel="external nofollow" download="baidu.png" />
注意,它僅支持同源鏈接下載,非同源鏈接還是會(huì)直接打開(kāi)圖片:
如非同源 <a href="http://www.baidu.com/img/baidu_jgylogo3.gif" download />
第一種(不同源)下載:
直接上代碼
var x=new XMLHttpRequest(); x.open("GET", "http://danml.com/wave2.gif", true); x.responseType = 'blob'; x.onload=function(e){ var url = window.URL.createObjectURL(x.response) var a = document.createElement('a'); a.href = url a.download = '' a.click() } x.send();
在點(diǎn)擊事件里添加以上代碼即可!親測(cè)有效
應(yīng)用案例
說(shuō)明:筆者在實(shí)際開(kāi)發(fā)中針對(duì)上述代碼進(jìn)行了測(cè)試,案例記錄如下:
1.html部分,應(yīng)用a鏈接添加時(shí)間響應(yīng),實(shí)現(xiàn)點(diǎn)擊下載功能:
<a rel="external nofollow" onclick="saveas(this.href,'202304191632188702.png');" target="_blank"> 202304191632188702.png </a>
2.點(diǎn)擊下載的js事件響應(yīng)部分,將上文提到的下載代碼封裝成一個(gè)函數(shù):
window.saveas = function(img,filename){ event.returnValue = false; let x=new XMLHttpRequest(); x.open("GET", img, true); x.responseType = 'blob'; x.onload=function(e){ let url = window.URL.createObjectURL(x.response); let a = document.createElement('a'); a.href = url a.download = filename a.click() } x.send(); }
注意:對(duì)比上文中的代碼,這里的函數(shù)封裝做了一定的改進(jìn),要注意兩點(diǎn):
①.首先 event.returnValue = false;
用來(lái)阻止默認(rèn)事件;
②.a.download = ''
必須傳入文件名!否則將會(huì)生成一個(gè).json 格式的文件!
- jquery插件jquery.LightBox.js實(shí)現(xiàn)點(diǎn)擊放大圖片并左右點(diǎn)擊切換效果(附demo源碼下載)
- 使用JS代碼實(shí)現(xiàn)點(diǎn)擊按鈕下載文件
- JS實(shí)現(xiàn)點(diǎn)擊下載的小例子
- JSP 點(diǎn)擊鏈接后下載文件(相當(dāng)于右鍵另存)功能
- Discuz! 5.0.0論壇程序中加入一段js代碼,讓會(huì)員點(diǎn)擊下載附件前自動(dòng)彈出提示窗口
- 使用 JavaScript 創(chuàng)建并下載文件(模擬點(diǎn)擊)
- 下載站常用的點(diǎn)擊下載地址提示設(shè)hao123為首頁(yè)的js代碼
相關(guān)文章
js函數(shù)與php函數(shù)的區(qū)別實(shí)例淺析
這篇文章主要介紹了js函數(shù)與php函數(shù)的區(qū)別,以實(shí)例形式較為簡(jiǎn)單的分析了js函數(shù)與php函數(shù)語(yǔ)法及應(yīng)用上的不同點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01微信小程序?qū)崿F(xiàn)多選刪除列表數(shù)據(jù)功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)多選刪除列表數(shù)據(jù)功能,涉及微信小程序列表數(shù)據(jù)讀取、顯示、刪除等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01小程序統(tǒng)計(jì)來(lái)源信息的方案與具體代碼
微信小程序數(shù)據(jù)統(tǒng)計(jì),現(xiàn)在有很多的統(tǒng)計(jì)方法和統(tǒng)計(jì)工具,下面這篇文章主要給大家介紹了關(guān)于小程序統(tǒng)計(jì)來(lái)源信息的方案與具體代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09layer實(shí)現(xiàn)登錄彈框,登錄成功后關(guān)閉彈框并調(diào)用父窗口的例子
今天小編就為大家分享一篇layer實(shí)現(xiàn)登錄彈框,登錄成功后關(guān)閉彈框并調(diào)用父窗口的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JavaScript類的繼承方法小結(jié)【組合繼承分析】
這篇文章主要介紹了JavaScript類的繼承方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript繼承的概念、原理及組合繼承相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-07-07用JavaScript來(lái)美化HTML的select標(biāo)簽的下拉列表效果
這篇文章主要介紹了用JavaScript來(lái)美化HTML的select標(biāo)簽的下拉列表效果的方法,而且在多瀏覽器下的兼容效果也得到提升,需要的朋友可以參考下2015-11-11JS簡(jiǎn)單添加元素新節(jié)點(diǎn)的方法示例
這篇文章主要介紹了JS簡(jiǎn)單添加元素新節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式分析了javascript針對(duì)頁(yè)面元素節(jié)點(diǎn)的創(chuàng)建、添加、克隆等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02Javascript的表單驗(yàn)證-初識(shí)正則表達(dá)式
JavaScript 可用來(lái)在數(shù)據(jù)被送往服務(wù)器前對(duì) HTML 表單中的這些輸入數(shù)據(jù)進(jìn)行驗(yàn)證。接下來(lái)通過(guò)本文給大家介紹Javascript的表單驗(yàn)證-初識(shí)正則表達(dá)式,對(duì)js表單驗(yàn)證正則表達(dá)式相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-03-03微信小程序生成海報(bào)分享朋友圈的實(shí)現(xiàn)方法
利用微信強(qiáng)大的社交能力通過(guò)小程序達(dá)到裂變的目的,拉取新用戶。下面小編給大家?guī)?lái)了微信小程序生成海報(bào)分享朋友圈的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧2019-05-05