3.1 拖拽屬性
draggable:auto | true | false
<div id="mydiv" draggable="true"></div>
3.2 拖動(dòng)事件
屬性 | 解釋 |
---|---|
dragstart(托) | 當(dāng)一個(gè)原不俗開始被拖拽的時(shí)候觸發(fā) |
drag(托) | 這個(gè)事件在拖拽源觸發(fā) |
dragend(托) | 拖拽源在拖拽操作結(jié)束將得到dragend事件對(duì)象薪丁,不管操作成功與否常侦。 |
dragenter(放) | 當(dāng)拖拽中的鼠標(biāo)第一次進(jìn)入一個(gè)元素的時(shí)候觸發(fā)戏溺。 |
dragover(放) | 當(dāng)拖拽中的鼠標(biāo)移動(dòng)經(jīng)過一個(gè)元素的時(shí)候觸發(fā) |
dragleave(放) | 當(dāng)拖拽的鼠標(biāo)離開元素時(shí)觸發(fā) |
drop(放) | 這個(gè)事件在拖拽操作結(jié)束釋放元素上觸發(fā)譬猫。 |
3.3 拖操作
<div id="mydiv" draggable="true"></div>
<script>
// 拖放操作
let mydiv = document.getElementById('mydiv')
//開始拖放
mydiv.ondragstart = function(){
console.log('開始拖放');
}
// 正在拖放
mydiv.ondrag = function(){
console.log('正在拖放');
}
// 結(jié)束拖放
mydiv.ondragend = function(){
console.log('正在拖放');
}
</script>
3.4 放操作
注意:放操作中 ”dragover和drop“ 會(huì)發(fā)生沖突,需要阻止 dragover 的默認(rèn)事件( e.preventDefault() )
<div id="put" draggable="true"></div>
<script>
// 放操作
let myput = document.getElementById('put')
// 進(jìn)入
myput.ondragenter = function(e){
console.log('進(jìn)入了');
}
// 進(jìn)故宮
myput.ondragover = function(e){
console.log('經(jīng)過了');
// 阻止默認(rèn)事件
e.preventDefault();
}
// 離去
myput.ondragleave = function(){
console.log('離去了');
}
// 放下
myput.ondrop = function(){
console.log('放下了');
}
</script>
3.5 拖和放的API操作
3.5.1 拖放事件
一般在一個(gè)元素開始被拖拽的時(shí)候,觸發(fā)dragstart時(shí)候設(shè)置與這次拖拽相關(guān)的信息弧烤,例如拖動(dòng)的數(shù)據(jù)和圖像。所有的拖拽事件都有一個(gè)屬性——dataTransfer源武,它包含著拖拽數(shù)據(jù)扼褪。
3.5.2 dataTransfer的屬性說明
屬性/方法 | 說明 |
---|---|
files | 其屬性返回和防止相關(guān)的所有文件 |
types | 屬性使用數(shù)組的形式返回當(dāng)前注冊(cè)的格式 |
effectAllowed | 此屬性的意思為通知瀏覽器當(dāng)前可被用戶選用的操作,如果只設(shè)置 copy粱栖,這只允許執(zhí)行出 copy 工作 |
dropEffect | 拖放的操作類型话浇,決定了瀏覽器如何顯示鼠標(biāo)形狀,可能的值為 copy闹究,move幔崖,link 和 none |
items | 屬性返回所有項(xiàng)與相關(guān)格式的所有文件 |
setData( format,data) | 在 dragstart 事件調(diào)用此函數(shù)在 dataTransfe 對(duì)象上的存儲(chǔ)數(shù)據(jù)。 |
getData(format) | 從 dataTransfer 對(duì)象取出數(shù)據(jù) |
setDragImage(element,x,y) | 使用存在的圖像元素作為拖動(dòng)圖像(x,y 表示鼠標(biāo)位置) |
addElement(element) | 調(diào)用此函數(shù)需要提供一個(gè)頁面元素作為參考,同時(shí)使用此參數(shù)作為拖放反饋圖像 |
clearData() | 不傳參數(shù)赏寇,表示清空所有已注冊(cè)數(shù)據(jù)吉嫩,帶參數(shù)則清楚指定的注冊(cè)數(shù)據(jù) |
3.5.3 演示示例:
<div id="contains"></div>
<div id="div1" class="myBlock" draggable="true">1</div>
<div id="div2" class="myBlock" draggable="true">2</div>
<div id="div3" class="myBlock" draggable="true">3</div>
<div id="div4" class="myBlock" draggable="true">4</div>
<div id="div5" class="myBlock" draggable="true">5</div>
<script>
// 元素的拖
let myBlock = document.querySelectorAll('.myBlock')
for(let i = 0; i< myBlock.length; i++){
myBlock[i].ondragstart = function(e){
// dataTransfer是 event事件
// 儲(chǔ)存id
e.dataTransfer.setData('id',this.id)
// 設(shè)置拖放時(shí) 物體的顯示
let img = new Image();
img.src = './素材.jpg'
e.dataTransfer.setDragImage(img,img.width/2,img.height/2)
// 為啥 第一次不顯示?
}
}
// 放
let contains = document.getElementById('contains')
// 1嗅定,阻止 ondragover的默認(rèn)事件
contains.ondragover = function(e){
e.preventDefault();
}
// 托 的元素放下時(shí)
contains.ondrop = function(e){
// 獲取之前存儲(chǔ)的 id
let id = e.dataTransfer.getData('id')
// 根據(jù)id 獲取當(dāng)前元素
let div = document.getElementById(id)
this.appendChild(div)
}
</script>
3.5.4 外部文件的操作
注意: 托外部文件需要取消 ondrop 的默認(rèn)事件自娩,否則會(huì)打開這個(gè)文件
<script>
let html = document.documentElement;
// 取消默認(rèn)事件,防止打開文件
html.ondragover = function(e){
e.preventDefault();
}
// 文件拖放
html.ondrop = function(e){
// 取消默認(rèn)事件
e.preventDefault()
let img = new Image();
// 獲取文件路徑
img.src = window.URL.createObjectURL(e.dataTransfer.files[0])
img.style.top = e.pageY + 'px';
img.style.left = e.pageX + 'px';
document.body.appendChild(img)
}
</script>