HTML5中的拖放實(shí)現(xiàn)詳解
關(guān)于HTML5中的拖放
拖放(Drag 和 Drop)是一種常見的特性,即抓取對(duì)象以后拖到另一個(gè)位置,在 HTML5 中,拖放是標(biāo)準(zhǔn)的組成部分。在HTML5中用戶可以使用鼠標(biāo)選擇一個(gè)可拖動(dòng)元素,將元素拖動(dòng)到一個(gè)可放置元素,并通過釋放鼠標(biāo)按鈕放到這些元素。在拖動(dòng)操作期間,可拖動(dòng)元素的半透明表示跟隨鼠標(biāo)指針。
如果我們希望元素可以被拖動(dòng),那么需要將其 draggable屬性設(shè)為true (a標(biāo)簽draggable默認(rèn)是true)
拖放的事件
在進(jìn)行拖放操作的不同階段會(huì)觸發(fā)數(shù)種事件,拖拽事件的dataTransfer屬性存放了拖放操作中的相關(guān)數(shù)據(jù)。
| dragstart | 作用于[源元素],當(dāng)一個(gè)元素開始被拖拽的時(shí)候觸發(fā),用戶拖拽的元素需要附加dragstart事件。在這個(gè)事件中,監(jiān)聽器將設(shè)置與這次拖拽相關(guān)的信息,例如拖動(dòng)的數(shù)據(jù)和圖像。 |
| dragenter | 作用于[源元素],當(dāng)拖拽中的鼠標(biāo)進(jìn)入一個(gè)元素的時(shí)候觸發(fā)。這個(gè)事件的監(jiān)聽器需要指明是否允許在這個(gè)區(qū)域釋放鼠標(biāo)。如果沒有設(shè)置監(jiān)聽器,或者監(jiān)聽器沒有進(jìn)行操作,則默認(rèn)不允許釋放。 |
| dragover | 作用于[目標(biāo)元素],當(dāng)拖拽中的鼠標(biāo)移動(dòng)經(jīng)過一個(gè)元素的時(shí)候觸發(fā)。 |
| dragleave | 作用于[目標(biāo)元素],當(dāng)拖拽中的鼠標(biāo)離開元素時(shí)觸發(fā)??梢宰鳛榭舍尫欧答伒母吡粱虿迦霕?biāo)記去除。 |
| drag | 作用于[源元素],事件在元素被拖動(dòng)時(shí)觸發(fā)。 |
| drop | 作用于[目標(biāo)元素],在拖拽操作結(jié)束釋放時(shí)于釋放元素上觸發(fā)。 |
| dragend | 作用于[源元素],拖拽源在拖拽操作結(jié)束時(shí)觸發(fā),不管操作成功與否。 |
(在拖拽的時(shí)候只會(huì)觸發(fā)拖拽的相關(guān)事件,鼠標(biāo)事件,例如mousemove,是不會(huì)觸發(fā)的)
DataTransfer 對(duì)象
在處理拖放操作時(shí),我們需要用到 DataTransfer 對(duì)象來保存被拖動(dòng)的數(shù)據(jù)。 DataTransfer 可以保存一項(xiàng)或多項(xiàng)數(shù)據(jù)、一種或者多種數(shù)據(jù)類型。
屬性
| dropEffect | dropEffect [String]指定實(shí)際的放置效果,可能的值: copy: 復(fù)制到新的位置 move: 移動(dòng)到新的位置 link: 建立一個(gè)源位置到新位置的鏈接 none: 禁止放置(禁止任何操作) |
| effectAllowed | [String]指定拖動(dòng)時(shí)被允許的效果,可能的值: copy: 復(fù)制到新的位置. move:移動(dòng)到新的位置 . link:建立一個(gè)源位置到新位置的鏈接. copyLink: 允許復(fù)制或者鏈接. copyMove: 允許復(fù)制或者移動(dòng). linkMove: 允許鏈接或者移動(dòng). all: 允許所有的操作. none: 禁止所有操作. uninitialized: 缺省值(默認(rèn)值), 相當(dāng)于 all. |
| files | 包含一個(gè)在數(shù)據(jù)傳輸上所有可用的本地文件列表。如果拖動(dòng)操作不涉及拖動(dòng)文件,此屬性是一個(gè)空列表。 |
| types | 保存一個(gè)被存儲(chǔ)數(shù)據(jù)的類型列表作為第一項(xiàng),順序與被添加數(shù)據(jù)的順序一致。如果沒有添加數(shù)據(jù)將返回一個(gè)空列表。 |
方法
| void addElement(Element element) | 設(shè)置拖動(dòng)源。通常不需要改變這項(xiàng),如果修改這項(xiàng)將會(huì)影響拖動(dòng)的哪個(gè)節(jié)點(diǎn)和dragend事件的觸發(fā)。默認(rèn)目標(biāo)是被拖動(dòng)的節(jié)點(diǎn) |
| void clearData(String type) | 刪除與給定類型關(guān)聯(lián)的數(shù)據(jù)。類型參數(shù)是可選的。如果類型為空或未指定,將刪除所有類型相關(guān)聯(lián)的數(shù)據(jù)。如果不存在指定類型的數(shù)據(jù),或數(shù)據(jù)傳輸不包含任何數(shù)據(jù),此方法將沒有任何效果。 |
| String getData(String type) | 獲得給定類型的數(shù)據(jù),如果給定類型的數(shù)據(jù)不存在或者數(shù)據(jù)轉(zhuǎn)存沒有包涵數(shù)據(jù),方法將返回一個(gè)空字符串。 |
| void setData(String type,String data) | 為一個(gè)給定的類型設(shè)置數(shù)據(jù)。如果該數(shù)據(jù)類型不存在,它將添加到的末尾,這樣類型列表中的最后一個(gè)項(xiàng)目將是新的格式。如果已經(jīng)存在的數(shù)據(jù)類型,替換相同的位置的現(xiàn)有數(shù)據(jù)。就是,當(dāng)更換相同類型的數(shù)據(jù)時(shí),不會(huì)更改類型列表的順序。 |
| void setDragImage(DOMElement image,long x,long y) | 自定義一個(gè)期望的拖動(dòng)時(shí)的圖片。大多數(shù)情況下,這項(xiàng)不用設(shè)置,因?yàn)楸煌蟿?dòng)的節(jié)點(diǎn)被創(chuàng)建成默認(rèn)圖片。 image 要用作拖動(dòng)反饋圖像元素 x 圖像內(nèi)的水平偏移量. y 像內(nèi)的垂直偏移量. |
瀏覽器支持
Internet Explorer 9+、Firefox、Opera 12、Chrome 以及 Safari 5+
演示代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Drag & Drop</title>
<style type="text/css">
.box {
display: inline-block;
width: 100px;
height: 100px;
border: 1px solid #ccccff;
background-color: #ccccff;
text-align: center;
line-height: 100px;
}
.bin {
width: 200px;
height: 200px;
padding: 10px;
border: 1px solid #ccccff;
overflow: hidden;
float: left;
}
</style>
</head>
<body>
<div style="display: table;">
<div class="bin">
<div class="box" draggable="true">可拖拽元素</div>
</div>
<div class="bin"> </div>
</div>
<script type="text/javascript">
var bins = document.querySelectorAll('.bin');
var boxs = document.querySelectorAll('.box');
var drag = null;
for (var i = 0; i < boxs.length; i++) {
var box = boxs[i];
box.onselectstart = function() {
return false;
};
box.ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/plain', e.target.outerHTML);
e.dataTransfer.setDragImage(e.target, 0, 0);
drag = this;
return true;
};
box.ondragend = function(e) {
drag = null;
return false
};
}
for (var i = 0; i < bins.length; i++) {
var bin = bins[i];
//當(dāng)拖曳元素進(jìn)入目標(biāo)元素
bin.ondragover = function(e) {
e.preentDefault();
return true;
};
//拖拽元素在目標(biāo)元素上移動(dòng)
bin.ondragenter = function(e) {
this.style.backgroundColor = '#eeeeff';
return true;
};
//拖拽元素在目標(biāo)元素上離開
bin.ondragleave = function(e) {
this.style.backgroundColor = '#fff';
return true;
};
//拖拽的元素在目標(biāo)元素上同時(shí)鼠標(biāo)放開
bin.ondrop = function(e) {
if (drag) {
drag.parentNode.removeChild(drag);
this.appendChild(drag);
}
this.style.backgroundColor = '#fff';
return false;
};
}
document.body.ondrop = function(e) {
e.preventDefault();
e.stopPropagation();
}
</script>
</body>
</html>
以上就是HTML5中的拖放相關(guān)資料介紹,需要的朋友可以參考一下。
相關(guān)文章

HTML5 拖放(Drag 和 Drop)詳解與實(shí)例代碼
本篇文章主要介紹了HTML5 拖放(Drag 和 Drop)詳解與實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-14HTML5拖放API實(shí)現(xiàn)拖放排序的實(shí)例代碼
HTML5 中提供了直接拖放的 API,極大的方便我們實(shí)現(xiàn)拖放效果,不需要去寫一大堆的 js,只需要通過監(jiān)聽元素的拖放事件就能實(shí)現(xiàn)各種拖放功能。2017-05-11- 這篇文章主要為大家詳細(xì)介紹了HTML5拖放效果的實(shí)現(xiàn)代碼,拖放即抓取對(duì)象以后拖到另一個(gè)位具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-17
- 拖放是一種常見的特性,即抓取對(duì)象以后拖到另一個(gè)位置。這篇文章主要介紹了HTML5 拖放功能實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-07-14
這篇文章主要介紹了HTML5逐步分析實(shí)現(xiàn)拖放功能的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-30



