這篇文章主要介紹“HTML5拖放Drag的方法”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“HTML5拖放Drag的方法”文章能幫助大家解決問題。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),大祥企業(yè)網(wǎng)站建設(shè),大祥品牌網(wǎng)站建設(shè),網(wǎng)站定制,大祥網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,大祥網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
1. 基本的JavaScript原生實(shí)現(xiàn)
通過原生的JavaScript 代碼實(shí)現(xiàn)拖放行為非常復(fù)雜, 需要使用DOM 事件模型里的mousedown、mousemove和mouseup事件,還需要不斷獲得鼠標(biāo)坐標(biāo),修改元素的坐標(biāo)位置,性能會(huì)成為很大問題。另外,實(shí)現(xiàn)時(shí)還需要考慮瀏覽器兼容性問題,并且不支持瀏覽器頁面以外的拖放行為。
2. JavaScript庫
jQuery等JavaScript庫提供了封裝好的拖放處理,解決了JavaScript原生實(shí)現(xiàn)的復(fù)雜性和兼容性問題。但是這些JavaScript庫為了保證兼容性進(jìn)行了復(fù)雜的計(jì)算和處理,使用了大量的代碼,造成庫的體積過大,影響頁面的加載速度,增大了網(wǎng)絡(luò)流量。
Drag & Drop API 的優(yōu)點(diǎn)
使用Drag & Drop API,可以給我們帶來如下好處。
? 它通過事件的方式讓瀏覽器原生支持拖放行為,我們不再需要編寫復(fù)雜的JavaScript代碼,不再需要考慮千奇百怪的瀏覽器兼容性問題。
? 用原生方式取代JavaScript代碼的方式也大大減少了頁面的大小,讓用戶能更快地打開頁面,減少帶寬請(qǐng)求。
? 它提供了dataTransfer接口來存儲(chǔ)數(shù)據(jù),允許我們定義拖放時(shí)的效果,此外還支持自定義拖放操作。
? 它支持瀏覽器頁面以外的拖放行為,例如從桌面拖放一個(gè)文件到瀏覽器頁面里,這在以前是不可能實(shí)現(xiàn)的。
Drag & Drop API 的主要操作
Drag & Drop API主要包含三方面的內(nèi)容:事件、屬性和接口,下面我們對(duì)它們一一進(jìn)行講解。
1. 主要事件
下面是拖放的相關(guān)事件,按照拖放的過程分為7個(gè)。
? dragstart。拖動(dòng)開始的事件,需綁定在拖曳對(duì)象上。
? drag。從dragstart開始后到dragend結(jié)束前,在拖動(dòng)時(shí)這個(gè)事件不斷出現(xiàn),需綁定在拖曳對(duì)象上。
? dragend。拖動(dòng)結(jié)束的事件,需綁定在拖曳對(duì)象上。
? dragenter。拖到當(dāng)前元素區(qū)域內(nèi)的事件,需綁定在推曳對(duì)象所拖曳的對(duì)象上。
? dragover。拖到當(dāng)前元素的區(qū)域上的事件,這個(gè)事件在拖動(dòng)過程中不斷被觸發(fā),需綁定在拖曳對(duì)象正拖曳到的對(duì)象上。
? dragleave。拖出當(dāng)前元素區(qū)域的事件,需綁定在拖曳對(duì)象剛剛拖曳到的對(duì)象上。
? drop。在當(dāng)前元素區(qū)域停止拖曳的事件,需綁定在拖曳對(duì)象所放置到的對(duì)象上。
一個(gè)完整的拖放事件過程如下圖所示,我們可以輕松地使用上面的事件來處理復(fù)雜的拖放行為。
一個(gè)完整的HTML5拖放事件過程
2. 相關(guān)屬性
默認(rèn)情況下,img和a標(biāo)簽可以進(jìn)行拖放。如果其他類型的節(jié)點(diǎn)也需要支持拖動(dòng),必須添加屬性draggable="true"。
使一個(gè)元素支持拖動(dòng)其實(shí)非常簡單,第一要為此元素設(shè)置draggable屬性,第二需要為它的dragstart事件添加函數(shù)來處理拖曳數(shù)據(jù)。
Drag & Drop API還有一個(gè)dropzone屬性,用于設(shè)置放置目標(biāo)區(qū)域所允許的文件類型和反饋方式,例如用move s:text/plain表示展現(xiàn)數(shù)據(jù)移動(dòng)的效果和接受任何文本的放置,用copy f:image/png表示展現(xiàn)數(shù)據(jù)復(fù)制的效果和接受png格式圖片的放置。
因此,要使一個(gè)元素允許其他拖曳元素放置到它之上,此元素必須要有dropzone屬性并且監(jiān)聽drop事件(和上面元素支持拖曳的兩個(gè)條件非常相似)。不過,我們也可以采用為放置元素自定義事件處理的方式來代替dropzone屬性,這就需要我們?cè)赿ragenter事件里判斷此元素是否支持放置以及在dragover事件里指定為用戶顯示什么樣的反饋效果。
3.主要接口
HTML5 使用dataTransfer 接口來支持拖放數(shù)據(jù)存儲(chǔ), 它的使用方式一般為event.dataTransfer。dataTransfer對(duì)象不僅可以用來傳遞數(shù)據(jù),還可以用來指定拖曳對(duì)象和放置對(duì)象所表現(xiàn)的反饋效果,它包含以下屬性和方法。
? dataTransfer.effectAllowed[=value]。
該屬性返回拖曳對(duì)象允許的拖曳時(shí)的反饋效果。作為方法時(shí),用于初始化dragenter和dragover事件時(shí)允許的dropEffect屬性,
可以設(shè)置的值如下表所示,其默認(rèn)值為uninitialized。
dropEffect屬性的值及描述:
dropEffect屬性的值及描述
這個(gè)屬性可以在拖曳對(duì)象的dragstart事件處理函數(shù)中設(shè)置,例如下面的代碼示例:
dragElement.ondragstart = function(e){
var dt = e.dataTransfer;
dt.effectAllowed = 'link';
};
? dataTransfer.dropEffect[=value]。
該屬性返回已設(shè)置的拖放時(shí)反饋效果。
作為方法時(shí),可以設(shè)置拖放對(duì)象時(shí)表現(xiàn)什么樣的反饋效果,包含如下值:none、copy、link和 move,這幾個(gè)值分別代表拖曳對(duì)象不能放置在此處、拖曳對(duì)象移動(dòng)到放置對(duì)象、拖曳對(duì)象被復(fù)制到放置對(duì)象、拖曳對(duì)象被鏈接到放置對(duì)象4種效果。
這4種效果表現(xiàn)為不同的鼠標(biāo)形狀,如下圖3-5所示。
不同的鼠標(biāo)形狀
dropEffect的設(shè)置可以在放置對(duì)象的dragenter或者dragover事件處理函數(shù)中處理,如下面的代碼所示。
dropElement.ondragover = function(e){
var dt = e.dataTransfer;
dt.dropEffect = 'link';
e.preventDefault();
};
另外,如果該效果與起初設(shè)置的effect-Allowed效果不符,則拖放操作將會(huì)失敗。
? dataTransfer.items。返回一個(gè)關(guān)于拖曳數(shù)據(jù)的DataTransferItemList對(duì)象。
? dataTransfer.setDragImage(element, x, y)。指定拖曳元素時(shí)隨鼠標(biāo)移動(dòng)的圖片,x、y分別是圖片相對(duì)于鼠標(biāo)的橫坐標(biāo)和縱坐標(biāo)。
? dataTransfer.addElement(element)。將元素添加到被拖曳的列表里。如果你想讓某個(gè)元素跟隨被拖曳元素一同被拖曳,可以使用這個(gè)方法。
? dataTransfer.types。返回在dragstart事件觸發(fā)時(shí)為元素存儲(chǔ)數(shù)據(jù)的格式。如果是系統(tǒng)文件的拖曳,則返回files。
? dataTransfer.setData(format, data)。為元素添加數(shù)據(jù),在dragstart事件觸發(fā)時(shí)可以用它為被拖曳元素存儲(chǔ)數(shù)據(jù)。setData的數(shù)據(jù)格式一般有兩種:text/plain(設(shè)置format為字符串text即可,主要用于文本數(shù)據(jù))和text/uri-list(設(shè)置format為字符串url即可,主要用于url)。
? data=dataTransfer.getData(format)。返回存儲(chǔ)的數(shù)據(jù)。如果數(shù)據(jù)不存在,則返回空字符串。
? dataTransfer.clearData([format])。刪除指定格式的數(shù)據(jù)。如果不指定格式,則刪除所有數(shù)據(jù)。
? dataTransfer.files。如果是拖曳系統(tǒng)文件,返回正在被拖曳的文件列表對(duì)象。可以通過它獲得所拖曳的文件數(shù)據(jù)。
dataTransfer對(duì)象提供的屬性和方法使得我們自定義處理拖放操作成為可能。
文件拖放上傳實(shí)例
下面的代碼清單是一個(gè)JavaScript代碼示例,演示了如何將一個(gè)元素拖放到另一個(gè)元素上,并且在鼠標(biāo)放下時(shí)改變放置目標(biāo)元素的狀態(tài)。
var dragElement = document.getElementById('drag-element');
var dropElement = document.getElementById('drop-element');
dragElement.setAttribute('draggable', 'true'); //允許dragElement元素可以拖動(dòng)
dragElement.ondragstart = function(e){
var dt = e.dataTransfer;
dt.effectAllowed = 'link'; //設(shè)置反饋效果為鏈接形式
};
dropElement.ondragover = function(e){
e.preventDefault();
}
dropElement.ondrop = function(){
dropElement.innerHTML = '拖曳結(jié)束'; //改變放置目標(biāo)元素的狀態(tài)
}
dropElement.ondragenter = function(e){
var dt = e.dataTransfer;
dt.dropEffect = 'link';
e.preventDefault();
};
可能犯的一個(gè)錯(cuò)誤
創(chuàng)建拖放事件監(jiān)聽程序時(shí),一定要阻止默認(rèn)行為,尤其是在dragover事件中一定要執(zhí)行preventDefault(),否則drop事件不會(huì)被觸發(fā),同時(shí)dropEffect也不會(huì)生效。
下面是正確的代碼:
dropElement.addEventListener('dragover', function(e){
e.preventDefault();
}, false);
請(qǐng)注意,dragstart事件里不能阻止默認(rèn)行為,否則拖曳行為就不會(huì)發(fā)生。
關(guān)于“HTML5拖放Drag的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
網(wǎng)頁名稱:HTML5拖放Drag的方法
網(wǎng)頁路徑:http://www.rwnh.cn/article10/ippggo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、自適應(yīng)網(wǎng)站、域名注冊(cè)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)