您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)H5如何實(shí)現(xiàn)拖放API,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
地上有石子,撿幾個(gè)吧 我是籃子 我是地 石子 石子 石子 石子 石子 石子 石子 石子 石子 石子
?。╣if演示是用的edge,我的ubuntu做gif太麻煩了,借了個(gè)windows)
這里用一個(gè)簡單的例子演示了如何實(shí)現(xiàn)拖放,那么問題來了,從上面的演示中你可以猜出一些屬性和方法的用法了,那些方法的作用究竟是怎樣的?那些個(gè)屬性又是啥意思呢?下面一一到來。
1、找到一個(gè)可拖的元素
正如不是所有人都叫大熊一樣,并不是所有的元素都是可以被拖的。img和a元素默認(rèn)可拖,其他元素默認(rèn)不可拖,當(dāng)時(shí)可以加一個(gè)draggable=true讓它可拖。
<p draggable='true'></p>
2、處理拖放有關(guān)事件
源對(duì)象:
dragstart:源對(duì)象開始拖放。
drag:源對(duì)象拖放過程中。
dragend:源對(duì)象拖放結(jié)束。
過程對(duì)象:
dragenter:源對(duì)象開始進(jìn)入過程對(duì)象范圍內(nèi)。
dragover:源對(duì)象在過程對(duì)象范圍內(nèi)移動(dòng)。
dragleave:源對(duì)象離開過程對(duì)象的范圍。
目標(biāo)對(duì)象:
drop:源對(duì)象被拖放到目標(biāo)對(duì)象內(nèi)。
我們可以用一個(gè)測試來看看這些事件的觸發(fā)時(shí)機(jī)和事件對(duì)象為何物。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>testEvents</title> <style type="text/css"> .source{ width: 50px; height: 50px; border: 1px solid red; } .process{ width: 100px; height: 100px; border: 1px solid black; margin-top: 10px; } .dest{ width: 100px; height: 100px; border: 1px solid green; margin-top: 10px; } </style></head><body> <p class="source" id="source" draggable="true"></p> <p class="process" id="process"></p> <p class="dest" id="dest"></p> <script type="text/javascript"> window.onload=function(){ var source = document.getElementById("source"); var process = document.getElementById("process"); var dest = document.getElementById("dest"); var sourceEle; source.addEventListener("dragstart",function(e){ console.log("source dragstart"); console.log(e); sourceEle = e.target; var dt = e.dataTransfer; dt.effectedAllowed = "all"; },false); process.addEventListener("dragenter",function(e){ console.log("process dragenter"); console.log(e); },false); process.addEventListener("dragover",function(e){ console.log("process dragover"); console.log(e); },false); process.addEventListener("dragleave",function(e){ console.log("process dragleave"); console.log(e); },false); source.addEventListener("drag",function(e){ console.log("source drag"); console.log(e); },false); dest.addEventListener("dragend",function(e){ console.log("dest dragend"); console.log(e); e.preventDefault(); },false); dest.addEventListener("drop",function(e){ console.log("dest drop"); console.log(e); dest.appendChild(sourceEle); e.preventDefault(); e.stopPropagation(); },false); document.ondragover = function(e){e.preventDefault();} document.ondrop = function(e){e.preventDefault();} } </script></body></html>
這個(gè)例子將拖放過過程涉及的事件做了一個(gè)羅列,這里不再細(xì)講,你可以查看控制臺(tái)看看事件的觸發(fā)順序和事件對(duì)象。
這里首字母大寫了,嚴(yán)格說叫做一個(gè)類,每一次拖放會(huì)實(shí)例化這個(gè)類,保存在事件對(duì)象的dataTransfer屬性中。其屬性和方法見下表(來自:http://www.cnblogs.com/ijjyo/p/4316232.html)
感謝這位兄臺(tái)的總結(jié),拿了你這么多東西,謝謝啊。
下面做一些簡單的測試
關(guān)于effectAllowed和dropEffect,這里將前者置為effectAllowed后者用下拉列表選擇,以便于看到不同的鼠標(biāo)樣式。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>testEvents</title> <style type="text/css"> .source{ width: 50px; height: 50px; border: 1px solid red; } .process{ width: 100px; height: 100px; border: 1px solid black; margin-top: 10px; } .dest{ width: 100px; height: 100px; border: 1px solid green; margin-top: 10px; } </style></head><body> <select id="dpe"> <option value="copy">copy</option> <option value="move">move</option> <option value="link">link</option> <option value="none">none</option> </select> <p class="source" id="source" draggable="true"></p> <p class="process" id="process"></p> <p class="dest" id="dest"></p> <script type="text/javascript"> window.onload=function(){ var source = document.getElementById("source"); var process = document.getElementById("process"); var dest = document.getElementById("dest"); var dpe = document.getElementById("dpe"); var dpev; dpe.onchange = function(){ dpev = this.value; } var sourceEle; source.addEventListener("dragstart",function(e){ console.log("source dragstart"); console.log(e); sourceEle = e.target; var dt = e.dataTransfer; dt.effectedAllowed = "all"; },false); dest.addEventListener("dragend",function(e){ console.log("dest dragend"); console.log(e); e.preventDefault(); },false); dest.addEventListener("drop",function(e){ console.log("dest drop"); console.log(e); dest.appendChild(sourceEle); e.preventDefault(); e.stopPropagation(); },false); document.ondragover = function(e){ e.dataTransfer.dropEffect = dpev; e.preventDefault(); } document.ondrop = function(e){e.preventDefault();} } </script></body></html>
我在ubuntu chrome測試法現(xiàn),都是一個(gè)手,但是置為none時(shí)拖不進(jìn)去了,可能不同系統(tǒng)會(huì)有一些差別。
關(guān)于setData()和getData()方法
這兩個(gè)是有關(guān)數(shù)據(jù)交換的方法,前者傳兩個(gè)參數(shù),第一參數(shù)是一個(gè)mime類型字符串,第二個(gè)是數(shù)據(jù);后者傳一個(gè)參數(shù),為mime類型。可用mime類型為text/plain,text/html,text/xml,text/uri-list.
測試用例,將菜單的菜拖到記錄本上。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>點(diǎn)菜</title> <style type="text/css"> .menu{ width: 200px; height: 300px; border: 1px solid red; margin-right: 10px; float: left; } .record{ width: 200px; height: 300px; border: 1px solid black; margin-right: 10px; float: left; } </style></head><body> <ul class="menu" id="menu"> <li draggable="true">糖醋排骨</li> <li draggable="true">青椒肉絲</li> <li draggable="true">武昌魚</li> <li draggable="true">手撕包材</li> <li draggable="true">千葉豆腐</li> </ul> <ul class="record" id="record"> </ul> <script type="text/javascript"> window.onload = function(){ var menu = document.getElementById("menu"); var record = document.getElementById("record"); menu.addEventListener("dragstart",function(e){ var dt = e.dataTransfer; var tar = e.target; if(tar.tagName=="LI"){ dt.setData("text/plain",tar.innerHTML); } dt.effectedAllowed = "all"; },false); record.addEventListener("drop",function(e){ var li = document.createElement("li"); li.appendChild(document.createTextNode(e.dataTransfer.getData("text/plain"))); record.appendChild(li); e.stopPropagation(); },false); record.addEventListener("dropend",function(e){ e.preventDefault(); },false); document.addEventListener("dragover",function(e){e.preventDefault()},false); document.addEventListener("drop",function(e){e.preventDefault()},false); } </script></body></html>
關(guān)于setDragImage(Element img,long x,long y)
這個(gè)方法是設(shè)置拖放時(shí)的圖標(biāo)的,第一個(gè)參數(shù)表是圖標(biāo)元素,第二個(gè)表示相對(duì)與光標(biāo)的水平偏移,第三個(gè)是垂直的。
還是前面的例子,在dragstart事件添加下面的代碼,拖動(dòng)時(shí)你會(huì)發(fā)現(xiàn)一只很大的手(不要被嚇到);
var img = document.createElement("img"); img.src = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1493802056263&di=232de2c30491e19f32833669ad5a67ae&imgtype=0&src=http%3A%2F%2Fstatic.freepik.com%2Ffree-photo%2Fone-finger_318-10333.jpg"; dt.setDragImage(img,10,10);
上面的例子已經(jīng)談到了拖放的數(shù)據(jù)傳遞方法,這里在總結(jié)一下。
1、通過dataTransfer的setData()和getData()方法傳遞
2、通過閉包的方法,請(qǐng)參考開篇的例子。
HTML5的拖放api非常簡潔實(shí)用,為我們省去了很多麻煩,如果沒有它,我們可能需要通過mousedownmousemove等等事件才能實(shí)現(xiàn)上述功能。本文較為詳細(xì)的介紹了相關(guān)api,希望對(duì)你有所幫助。關(guān)于拖放api的應(yīng)用大家可以參看下面鏈接的文章,他做了一個(gè)拖放排序,這是一個(gè)比較常見的應(yīng)用場景。
關(guān)于H5如何實(shí)現(xiàn)拖放API就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。