使用原生js實(shí)現(xiàn)拖拽和粘貼上傳圖片功能
Vue/Rect 生態(tài)用多了都快忘記原生js怎么寫了,今天需要直接在服務(wù)器裸寫個頁面,實(shí)現(xiàn) textarea 文本框里接收拖拽多個圖片,同時(shí)能直接粘貼截圖上傳,使用一些現(xiàn)成的框架倒是分分鐘完成,但要直接裸寫,還是費(fèi)了思量。
html中的textarea元素
<textarea id="textarea" placeholder="可拖拽圖片到此上傳,或截圖后在此粘貼"></textarea>
實(shí)現(xiàn)思路:
無論是拖拽上傳,還是粘貼上傳,本質(zhì)都是使用 FormData 包裝 File數(shù)據(jù),傳遞給服務(wù)器,關(guān)鍵點(diǎn)是取到File或Blob數(shù)據(jù)。
在拖拽時(shí),可在 drop 放下動作時(shí),通過event.dataTransfer.files獲取到文件數(shù)據(jù)。
在粘貼監(jiān)聽 paste 事件時(shí),可通過event.clipboardData.items獲取到剪切板中的第一個Blob數(shù)據(jù),然后調(diào)用Blog的getAsFile轉(zhuǎn)為File。
再判斷他們的mime類型如果是圖片,則上傳。
先實(shí)現(xiàn)上傳函數(shù)
使用原生xhr實(shí)現(xiàn),無它,簡單。
假設(shè)服務(wù)器返回json格式數(shù)據(jù)
code=0代表上傳成功,返回url地址,code=其他失敗,msg字段填充失敗信息
// 接口 File或 Blob類型數(shù)據(jù)
const uploadimg=function(file){
// 創(chuàng)建 FormData 對象
var formData = new FormData();
// 添加圖片文件到表單數(shù)據(jù)中
formData.append('file', file);
// 創(chuàng)建 XMLHttpRequest 對象
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í),動態(tài)添加一個outline邊框,以便區(qū)分。
// 元素
var textArea = document.getElementById('textarea');
// 拖拽到上方時(shí),添加一個 outline 樣式
var addOutline = function() {
textArea.style.outline = "2px solid #0000FF";
};
// 松開時(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)移動時(shí)防止瀏覽器默認(rèn)行為
textArea.addEventListener('dragover', function(event) {
event.stopPropagation();
event.preventDefault();
});
// 文件離開區(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)聽 粘貼 事件,獲取剪切板中第一個數(shù)據(jù)。
// 粘貼處理函數(shù)
textArea.addEventListener('paste', function(event) {
// 阻止默認(rèn)行為
event.preventDefault();
// 只檢查第一個數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
小程序?qū)崿F(xiàn)頁面跳轉(zhuǎn)與數(shù)據(jù)傳遞方案
在開發(fā)過程中經(jīng)常會遇到在微信小程序的頁面跳轉(zhuǎn)以及數(shù)據(jù)傳遞的知識點(diǎn),所以下面這篇文章主要給大家介紹了關(guān)于小程序?qū)崿F(xiàn)頁面跳轉(zhuǎn)與數(shù)據(jù)傳遞的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Bootstrap導(dǎo)航條可點(diǎn)擊和鼠標(biāo)懸停顯示下拉菜單
這篇文章主要為大家詳細(xì)介紹了Bootstrap導(dǎo)航條可點(diǎn)擊和鼠標(biāo)懸停顯示下拉菜單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
BootStrap 獲得輪播中的索引和當(dāng)前活動的焦點(diǎn)對象
這篇文章主要介紹了BootStrap 獲得輪播中的索引和當(dāng)前活動的焦點(diǎn)對象,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-05-05
JS實(shí)現(xiàn)將數(shù)字金額轉(zhuǎn)換為大寫人民幣漢字的方法
這篇文章主要介紹了JS實(shí)現(xiàn)將數(shù)字金額轉(zhuǎn)換為大寫人民幣漢字的方法,涉及javascript字符串與數(shù)組操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08
JavaScript中將負(fù)數(shù)轉(zhuǎn)換為正數(shù)的超詳細(xì)過程
在JavaScript編程中經(jīng)常需要處理數(shù)字的正負(fù)值,如果你需要將一個負(fù)數(shù)轉(zhuǎn)換為正數(shù),可以使用一些簡單的數(shù)學(xué)操作和條件語句來實(shí)現(xiàn),這篇文章主要介紹了JavaScript中將負(fù)數(shù)轉(zhuǎn)換為正數(shù)的相關(guān)資料,需要的朋友可以參考下2025-10-10
javascript中利用柯里化函數(shù)實(shí)現(xiàn)bind方法【推薦】
下面小編就為大家?guī)硪黄猨avascript中利用柯里化函數(shù)實(shí)現(xiàn)bind方法【推薦】。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2016-04-04
AJAX跨域請求json數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章介紹了AJAX跨域請求json數(shù)據(jù)的實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-11-11
淺析Javascript中bind()方法的使用與實(shí)現(xiàn)
下面小編就為大家?guī)硪黄獪\析Javascript中bind()方法的使用與實(shí)現(xiàn)。小編覺得挺不錯的,現(xiàn)在分享給大家,一起跟隨小編過來看看吧2016-04-04

