H5拖拽7個事件
1.簡介
(1)藍圖
拖動源
放置目標
拖放並不是單純的把目標從一個地方移動另一個地方,其實是促成成功互動的操作過程中的反饋。
游標指示當前的位置是否可防置目標
使用者提示是移動、連結或者複製
滑鼠經過的地方樣式改變,提示此處可以放置。
為滿足以上的要求,瀏覽器在拖拽的每個過程中發起一系列的事件。
資料傳輸:一組物件,這個物件用來公開儲存,拖動資料儲存是拖放操作的基礎。可以將傳輸資料理解成拖放的中央控制部分,用於反饋的圖片以及資料自身的檢索全部都在資料傳輸中管理。類似網路傳輸談判,此時根本無需讓拖動源和放置目標知道彼此的存在。此時其重要作用的就是MIME型別!
(2)MIME 多功能因特網郵件擴充套件服務
text/plain
image/png
image/jpeg
text/x-age 傳遞自定義的資訊型別
事件
事件捕獲:從父輩–→中間–→子輩
事件冒泡:反向
event.stopPropagation //阻止事件沿事件捕獲鏈向下傳遞 或者 通過冒泡階段向上傳遞。
event.preventDefault //阻止事件的預設行為,比如連結跳轉。
“------------------------------------------------------------------------------------------------------------”
2.H5拖拽的7個事件分別是
ondragstart 只能在這個事件的過程中支援dataTransfer通過setData來設定資料。這是為了安全考慮。編號1
ondrag 拖動過程中持續發生的事件。就是滑鼠移動的過程中會反覆的呼叫此事件。編號2
ondragenter 拖動跨入了頁面中新元素的時候觸發,適用於設定拖放的放置反饋。編號3
ondragleave 恢復放置反饋,與上一事件相對。編號4
ondragover 不同於drag事件,此事件是在當前滑鼠停留的目標上呼叫。編號5
ondrop 釋放滑鼠呼叫,要放置包含處理放置動作的程式碼。編號6
ondragend 在拖動源中觸發,適合清空拖動過程的狀態。編號7
3.設定、傳輸和控制
設定可以拖動,很簡單就一句話
<div id = "huang" draggable="true">
setData(formate, data) //設定資料
getData(formate) //獲得資料
types 一陣列形式返回所有當前註冊的格式
items 返回所有想及其相關格式的列表
files 返回與放置相關的所有檔案
clearData( )
//更改拖放反饋
setDragImage(element, x, y):圖片出現在滑鼠的旁邊,則x,y就是相對滑鼠的偏移了。
addElement(element)通知瀏覽器將引數作為拖動反饋影象來繪製。?
//設定開發人員設定和查詢
effecftAllowed( )設定引數,允許使用者進行何種操作,copy/link/Move/組合
dropEffect( )
4.下面再進行展示一段程式碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width" initial-scale=1>
<title>拖拽7個事件</title>
<style>
body{
width: 100%;
height: 50%;
display: flex;
justify-content: space-between;
}
#left{
width: 150px;
height: 300px;
background-color: hotpink;
user-select: none;
}
#right{
width: 150px;
height: 300px;
background-color: skyblue;
user-select: none;
}
</style>
</head>
<body>
<div id="left" draggable="true">目標元素</div>
<div id="right" draggable="true">拖拽元素</div>
<script>
let n = 0;
//拖拽元素 你當前拖動的元素
const right = document.querySelector('#right');
//拖拽一瞬間
right.ondragstart = function () {
this.style.backgroundColor = 'red';
};
//連續觸發
right.ondrag = function () {
document.title = n++
}
right.ondragend = function () {
this.style.backgroundColor = 'skyblue';
}
//目標元素 目的地,把拖動的元素,拖動到哪裡
const left = document.querySelector('#left');
left.ondragenter = function () {
this.style.backgroundColor = 'orange';
//滑鼠進入才行
this.innerText = '請釋放滑鼠';
}
left.ondragleave = function () {
this.style.backgroundColor = 'hotpink';
this.innerText = '滑鼠離開';
};
//在目標元素上連續觸發
left.ondragover = function (e) {
document.title = n++;
e.preventDefault();
e.stopPropagation();
return false;
};
//具體要做什麼,非常重要
//在目標元素上釋放滑鼠
left.ondrop = function () {
//具體做啥操作,在此操作
console.log(123);
document.body.removeChild(right);
return false;
}
</script>
</body>
</html>
5.火狐與谷歌的相容性問題
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>火狐相容</title>
<style>
body{
width: 100%;
height: 50%;
display: flex;
justify-content: space-between;
}
*{
margin: 0;
padding: 0;
}
body>*{
width: 150px;
height: 300px;
user-select: none;
}
#left{
text-align: center;
background-color: hotpink;
line-height: 300px;
}
ul li{
text-align: center;
height: 35px;
line-height: 35px;
color: blue;
margin: 15px auto;
border: 2px dashed #dddddd;
}
</style>
</head>
<body>
<div id="left">請拖拽內容到此區域</div>
<ul id="list">
<li draggable="true">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
const aLi = document.querySelectorAll('li');
const list = document.getElementById('list');
aLi.forEach((item,index)=>{
//谷歌下
item.setAttribute('draggable','true');
item.ondragstart = function (e) {
console.log(e.dataTransfer);
const dt = e.dataTransfer;
//火狐
dt.setData('key',index);
}
})
//拖拽進入
left.ondragenter = function () {
this.innerText = '請釋放你的滑鼠';
};
//阻止預設事件
left.ondragover = function (e) {
e.preventDefault();
e.stopPropagation();
return false;
};
//拖拽離開目標物體時
left.ondragleave = function () {
this.innerText = '請拖拽內容到此區域';
};
//拖拽結束時
left.ondrop = function (e) {
const dt = e.dataTransfer;
console.log(dt.getData('key'));//獲取索引
console.log(list);
list.removeChild(aLi[dt.getData('key')]);
}
</script>
</body>
</html>