使用原生js實(shí)現(xiàn)拖拽和粘貼上傳圖片功能
Vue/Rect 生態(tài)用多了都快忘記原生js怎么寫(xiě)了,今天需要直接在服務(wù)器裸寫(xiě)個(gè)頁(yè)面,實(shí)現(xiàn) textarea 文本框里接收拖拽多個(gè)圖片,同時(shí)能直接粘貼截圖上傳,使用一些現(xiàn)成的框架倒是分分鐘完成,但要直接裸寫(xiě),還是費(fèi)了思量。
html中的textarea元素
<textarea id="textarea" placeholder="可拖拽圖片到此上傳,或截圖后在此粘貼"></textarea>
實(shí)現(xiàn)思路:
無(wú)論是拖拽上傳,還是粘貼上傳,本質(zhì)都是使用 FormData 包裝 File數(shù)據(jù),傳遞給服務(wù)器,關(guān)鍵點(diǎn)是取到File或Blob數(shù)據(jù)。
在拖拽時(shí),可在 drop
放下動(dòng)作時(shí),通過(guò)event.dataTransfer.files
獲取到文件數(shù)據(jù)。
在粘貼監(jiān)聽(tīng) paste
事件時(shí),可通過(guò)event.clipboardData.items
獲取到剪切板中的第一個(gè)Blob數(shù)據(jù),然后調(diào)用Blog的getAsFile轉(zhuǎn)為File。
再判斷他們的mime類型如果是圖片,則上傳。
先實(shí)現(xiàn)上傳函數(shù)
使用原生xhr實(shí)現(xiàn),無(wú)它,簡(jiǎn)單。
假設(shè)服務(wù)器返回json格式數(shù)據(jù)
code=0代表上傳成功,返回url地址,code=其他失敗,msg字段填充失敗信息
// 接口 File或 Blob類型數(shù)據(jù) const uploadimg=function(file){ // 創(chuàng)建 FormData 對(duì)象 var formData = new FormData(); // 添加圖片文件到表單數(shù)據(jù)中 formData.append('file', file); // 創(chuàng)建 XMLHttpRequest 對(duì)象 var xhr = new XMLHttpRequest(); // 設(shè)置上傳完成后的回調(diào)函數(shù) xhr.onload = function() { if (xhr.status == 200) { try { // 解析服務(wù)器返回的JSON數(shù)據(jù) {code:0,msg:msg} var response = JSON.parse(xhr.responseText); if (response && response.code === 0) { } else { console.error('Error uploading image: ' + response.msg); } } catch (e) { console.error('Error parsing server response as JSON'); } } else { console.log('Error uploading image'); } }; xhr.onerror=function(){ console.log('error') } xhr.open('POST', '/index/upload', true); // 發(fā)送圖片文件數(shù)據(jù) xhr.send(formData); }
為 textarea 綁定拖拽事件函數(shù)
在拖拽進(jìn)入textarea區(qū)域時(shí),動(dòng)態(tài)添加一個(gè)outline邊框,以便區(qū)分。
// 元素 var textArea = document.getElementById('textarea'); // 拖拽到上方時(shí),添加一個(gè) outline 樣式 var addOutline = function() { textArea.style.outline = "2px solid #0000FF"; }; // 松開(kāi)時(shí),移除outline 樣式 var removeOutline = function() { textArea.style.outline = ""; }; // 當(dāng)有圖片拖拽進(jìn)入?yún)^(qū)域時(shí)添加outline textArea.addEventListener('dragenter', function(event) { event.stopPropagation(); event.preventDefault(); addOutline(); }); // 文件在區(qū)域內(nèi)移動(dòng)時(shí)防止瀏覽器默認(rèn)行為 textArea.addEventListener('dragover', function(event) { event.stopPropagation(); event.preventDefault(); }); // 文件離開(kāi)區(qū)域時(shí)移除邊框 textArea.addEventListener('dragleave', function(event) { event.stopPropagation(); event.preventDefault(); removeOutline(); }); // 文件放下時(shí)進(jìn)行處理 textArea.addEventListener('drop', function(event) { event.stopPropagation(); event.preventDefault(); removeOutline(); // 獲取文件列表 var files = event.dataTransfer.files; if (files.length > 0) { // 遍歷處理所有圖片 [].forEach.call(files,function(file){ if(file.type.match('image.*')){ uploadimg(file); } }) } });
綁定粘貼處理函數(shù)
再監(jiān)聽(tīng) 粘貼 事件,獲取剪切板中第一個(gè)數(shù)據(jù)。
// 粘貼處理函數(shù) textArea.addEventListener('paste', function(event) { // 阻止默認(rèn)行為 event.preventDefault(); // 只檢查第一個(gè)數(shù)據(jù),是否是圖片類型 if (event.clipboardData && event.clipboardData.items) { var items = event.clipboardData.items; let i=0; // 如果找到圖片類型 if (items[i].type.indexOf('image') !== -1) { var blob = items[i].getAsFile(); uploadimg(blob); } } }); }
效果
到此這篇關(guān)于原生js實(shí)現(xiàn)拖拽和粘貼上傳圖片功能的文章就介紹到這了,更多相關(guān)js拖拽和粘貼上傳圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript table排序 這個(gè)更簡(jiǎn)單了,不用改變現(xiàn)在的表格結(jié)構(gòu)
另外一個(gè)table排序,這個(gè)更簡(jiǎn)單了,不用改變現(xiàn)在的表格結(jié)構(gòu),來(lái)自國(guó)外的代碼。2010-04-04ES6學(xué)習(xí)教程之對(duì)象的擴(kuò)展詳解
這篇文章主要給大家介紹了ES6中對(duì)象擴(kuò)展的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05簡(jiǎn)單實(shí)用的反饋表單無(wú)刷新提交帶驗(yàn)證
表單無(wú)刷新提交帶驗(yàn)證,非常適用于反饋,具體的實(shí)現(xiàn)如下包含各個(gè)功能代碼,喜歡的朋友可以參考下2013-11-11深入分析escape()、encodeURI()、encodeURIComponent()的區(qū)別及示例
這篇文章主要介紹了escape()、encodeURI()、encodeURIComponent()的區(qū)別,需要的朋友可以參考下2014-08-08Elasticsearch工具cerebro的安裝與使用教程
這篇文章主要介紹了Elasticsearch工具cerebro的安裝與使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Javascript獲取隨機(jī)數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Javascript獲取隨機(jī)數(shù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06JavaScript箭頭函數(shù)的五種使用方法及三點(diǎn)注意事項(xiàng)
這篇文章主要介紹了JavaScript箭頭函數(shù)的五種使用方法及三點(diǎn)注意事項(xiàng),箭頭函數(shù)是ES6新增的定義函數(shù)的方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,需要的朋友可以參考一下2022-08-08javascript實(shí)現(xiàn)rgb顏色轉(zhuǎn)換成16進(jìn)制格式
本文給大家分享的是使用javascript實(shí)現(xiàn)rgb顏色轉(zhuǎn)換成16進(jìn)制格式的方法和示例代碼,有需要的小伙伴可以參考下。2015-07-07