JS HTML5拖拽上傳圖片預(yù)覽
本文實(shí)例為大家分享了JS HTML5拖拽上傳圖片預(yù)覽的具體代碼,供大家參考,具體內(nèi)容如下
1.文件API:(File API)
file類型的的表單控件選擇的每一個(gè)文件都是一個(gè)file對(duì)象,而FileList對(duì)象則是這些file對(duì)象的集合列表,代表所選擇的所有文件。file對(duì)象繼承于Blob對(duì)象,該對(duì)象表示二進(jìn)制原始數(shù)據(jù),提供slice方法,可以訪問到字節(jié)內(nèi)部的原始數(shù)據(jù)塊。總之,file對(duì)象包含與FlieList對(duì)象,而file對(duì)象繼承于Blob對(duì)象!
各對(duì)象的相關(guān)屬性關(guān)系:

FileReader接口:
由圖可知:HTML5還提供了FileReader接口:用于將文件讀入內(nèi)存,并讀取文件中的數(shù)據(jù)。
var reader=new FileReader();
該接口總共有四個(gè)方法和六個(gè)事件:
•readAsBinaryString(file):讀取文件為二進(jìn)制
•readAsDataURL(file):讀取文件DataURL
•readAsText(file,[encoding]):讀取文件為文本
•about(none):中斷文件讀取
--------------------------------------------------------------------------------
•onabort:讀取文件中斷時(shí)觸發(fā)
•onerror:讀取文件出錯(cuò)時(shí)觸發(fā)
•onloadstart:讀取文件開始時(shí)觸發(fā)
•onprogress:讀取文件中時(shí)一直觸發(fā)
•onload:讀取文件成功時(shí)觸發(fā)
•onloadend:讀取文件結(jié)束時(shí)觸發(fā)(成功和失敗都會(huì)觸發(fā))
以上事件參數(shù)e有e.target.result或this.result指向讀取的結(jié)果!
2.拖放API:
拖放屬性:將需要拖放的元素的dragable屬性設(shè)置為true(dragable=”true”)!img元素和a元素默認(rèn)可以拖放。
拖放事件:(分為拖放元素事件和目標(biāo)元素事件)
拖放元素事件:
•dragstart:拖拽前觸發(fā)
•drag ,拖拽前、拖拽結(jié)束之間,連續(xù)觸發(fā)
•dragend , 拖拽結(jié)束觸發(fā)
目標(biāo)元素事件:
•dragenter , 進(jìn)入目標(biāo)元素觸發(fā)
•dragover ,進(jìn)入目標(biāo)、離開目標(biāo)之間,連續(xù)觸發(fā)
•dragleave , 離開目標(biāo)元素觸發(fā)
•drop , 在目標(biāo)元素上釋放鼠標(biāo)觸發(fā)
但是!需要注意的是:在目標(biāo)元素中dragover和drop事件中要阻止默認(rèn)行為(拒絕被拖放),否則拖放不能被實(shí)現(xiàn)!
-----------------------------
DataTransfer對(duì)象:專門用于存放拖放時(shí)要攜帶的數(shù)據(jù),可以被設(shè)置為拖放事件的dataTransfer屬性。
3個(gè)屬性:
•effectAllowed : 設(shè)置光標(biāo)樣式(none, copy, copyLink, copyMove, link, linkMove, move, all 和 uninitialized)
•effectAllowed:設(shè)置拖放操作的視覺效果
•types:存入數(shù)據(jù)的種類,字符串的偽數(shù)組
•files:獲取外部拖拽的文件,返回一個(gè)fileList列表,filesList下有個(gè)type屬性,返回文件的類型
4個(gè)方法:
•setData() : 設(shè)置數(shù)據(jù) key和value(必須是字符串)
•getData() : 獲取數(shù)據(jù),根據(jù)key值,獲取對(duì)應(yīng)的value
•clearData():清除DataTransfer對(duì)象存放的數(shù)據(jù)
•setDragImage(imageUrl,log x,long y):用img元素來設(shè)置拖放圖標(biāo)
//示例:
target.addEventListener('dragstart',function(e){
var fs = e.dataTransfer.files;//獲取拖放的文件對(duì)象列表FlieList對(duì)象
var dt=e.dataTransfer;//作為拖放事件的dataTransfer屬性
dt.effectAllowed='copy';
dt.setData('text/plain','hello');
dt.setDragImage(dragIcom,-10,-10);
});
3.拖拽上傳圖片預(yù)覽:
思路:
1.熟悉文件拖拽 目標(biāo)元素 的四個(gè)事件,注意:ondragover、ondrop事件中阻止默認(rèn)行為
2.拖拽放置后,獲取到文件對(duì)象集合:e.dataTransfer.files
3.循環(huán)該集合中的每個(gè)文件對(duì)象,判斷文件類型以及文件大小,是指定類型則進(jìn)行相應(yīng)的操作
4.讀取文件信息對(duì)象:new FileReader(),它有讀取文件對(duì)象為DataUrl等方法:readAsDataURL(文件對(duì)象)、讀取成功之后觸發(fā)的事件:onload事件等,this.result為讀取到的數(shù)據(jù)
5.在FileReader對(duì)象中的幾個(gè)事件中進(jìn)行相應(yīng)的邏輯處理
HTML:
<div class="container"> <p class="text">請(qǐng)將圖片文件拖拽至此區(qū)域!</p> </div>
總加載數(shù):<span id='total'>100</span>
JQ:
<script type="text/javascript">
$(function() {
/*思路:
*1.熟悉文件拖拽 目標(biāo)元素 的四個(gè)事件,注意:ondragover、ondrop事件中阻止默認(rèn)行為
*2.拖拽放置后,獲取到文件對(duì)象集合:e.dataTransfer.files
*3.循環(huán)該集合中的每個(gè)文件對(duì)象,判斷文件類型以及文件大小,是指定類型則進(jìn)行相應(yīng)的操作
*4.讀取文件信息對(duì)象:new FileReader(),它有讀取文件對(duì)象為DataUrl等方法:readAsDataURL(文件對(duì)象)、讀取成功之后觸發(fā)的事件:onload事件等,this.result為讀取到的數(shù)據(jù)
*5.在FileReader對(duì)象中的幾個(gè)事件中進(jìn)行相應(yīng)的邏輯處理
*
*/
//必須將jq對(duì)象轉(zhuǎn)換為js對(duì)象,調(diào)用原生方法
var oDiv = $(".container").get(0);
var oP = $(".text");
//進(jìn)入
oDiv.ondragenter = function() {
oP.html('');
}
//移動(dòng),需要阻止默認(rèn)行為,否則直接在本頁面中顯示文件
oDiv.ondragover = function(e) {
e.preventDefault();
}
//離開
oDiv.onleave = function() {
oP.html('請(qǐng)將圖片文件拖拽至此區(qū)域!');
}
//拖拽放置,也需要阻止默認(rèn)行為
oDiv.ondrop = function(e) {
e.preventDefault();
//獲取拖拽過來的對(duì)象,文件對(duì)象集合
var fs = e.dataTransfer.files;
//若為表單域中的file標(biāo)簽選中的文件,則使用form[表單name].files[0]來獲取文件對(duì)象集合
//打印長度
console.log(fs.length);
//循環(huán)多文件拖拽上傳
for (var i = 0; i < fs.length; i++) {
//文件類型
var _type = fs[i].type;
console.log(_type);
//判斷文件類型
if (_type.indexOf('image') != -1) {
//文件大小控制
console.log(fs[i].size);
//讀取文件對(duì)象
var reader = new FileReader();
//讀為DataUrl,無返回值
reader.readAsDataURL(fs[i]);
reader.onloadstart = function(e) {
//開始加載
}
// 這個(gè)事件在讀取進(jìn)行中定時(shí)觸發(fā)
reader.onprogress = function(e) {
$("#total").html(e.total);
}
//當(dāng)讀取成功時(shí)觸發(fā),this.result為讀取的文件數(shù)據(jù)
reader.onload = function() {
//文件數(shù)據(jù)
// console.log(this.result);
//添加文件預(yù)覽
var oImg = $("<img style='width:100px;' src='' />");
oImg.attr("src", this.result);
$(oDiv).append(oImg); //oDiv轉(zhuǎn)換為js對(duì)象調(diào)用方法
}
//無論成功與否都會(huì)觸發(fā)
reader.onloadend = function() {
if (reader.error) {
console.log(reader.error);
} else {
//上傳沒有錯(cuò)誤,ajax發(fā)送文件,上傳二進(jìn)制文件
}
}
} else {
alert('請(qǐng)上傳圖片文件!');
}
}
}
});
</script>
效果圖:

總結(jié):結(jié)合拖放事件API,DataTransfer對(duì)象和文件讀取對(duì)象FileList等方面的知識(shí),實(shí)現(xiàn)簡易拖拽上傳圖片預(yù)覽效果。需要了解熟悉個(gè)對(duì)象的關(guān)系以及用法,明確好實(shí)現(xiàn)思路!
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡單了解JavaScript彈窗實(shí)現(xiàn)代碼
這篇文章主要介紹了簡單了解JavaScript彈窗實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
1分鐘快速了解js實(shí)現(xiàn)下載文件功能的4種方式
在前端開發(fā)中,我們經(jīng)常需要實(shí)現(xiàn)文件下載功能,例如下載用戶上傳的圖片、用戶生成的文件等,這篇文章主要給大家介紹了關(guān)于如何通過1分鐘快速了解js實(shí)現(xiàn)下載文件功能的4種方式,需要的朋友可以參考下2024-03-03
仿谷歌主頁js動(dòng)畫效果實(shí)現(xiàn)代碼
昨天看到谷歌的主頁上出現(xiàn)了幾個(gè)動(dòng)畫,發(fā)現(xiàn)不是flash做的,而是用js+圖片實(shí)現(xiàn)的!今天把拷貝到的圖片,用js實(shí)現(xiàn)了動(dòng)畫效果!2013-07-07
js中小數(shù)向上取整數(shù),向下取整數(shù),四舍五入取整數(shù)的實(shí)現(xiàn)(必看篇)
下面小編就為大家?guī)硪黄猨s中小數(shù)向上取整數(shù),向下取整數(shù),四舍五入取整數(shù)的實(shí)現(xiàn)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
JavaScript實(shí)現(xiàn)手寫循環(huán)滑動(dòng)效果
最近一直在做業(yè)務(wù),遇到一個(gè)需求是頁面頂部需要展示圖片,可以拖動(dòng),拖動(dòng)到最后一張的時(shí)候需要無縫切換到第一張,從而實(shí)現(xiàn)循環(huán)滑動(dòng),所以本文就來和大家分享一下實(shí)現(xiàn)方法2023-05-05
微信小程序下面商品左右滑動(dòng)上面tab也跟隨變動(dòng)功能實(shí)現(xiàn)
這篇文章主要介紹了小程序下面商品左右滑動(dòng)上面tab也跟隨變動(dòng)功能,也就是點(diǎn)擊tab切換下面的商品信息,滑動(dòng)下面的商品信息tab也進(jìn)行切換,本文給大家分享實(shí)現(xiàn)代碼,需要的朋友可以參考下2022-07-07
javascript刪除數(shù)組元素并且數(shù)組長度減小的簡單實(shí)例
本篇文章主要是對(duì)javascript刪除數(shù)組元素并且數(shù)組長度減小的簡單實(shí)例進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-02-02

