上一篇介紹了拖拽的基礎知識,這節咱們談談拖拽的一些應用javascript
HTML5不單單定義了拖拽的事件類型,還在事件對象中規範了一個重量級的對象:dataTransfer,藉助它,咱們能夠實現數據傳輸、拖拽圖案設定、拖拽文件上傳,可經過event.dataTransfer來訪問該對象.html
須要藉助event.dataTransfer
對象的一些方法實現。經過setData(dataType:string,data:string)
來設置待傳輸的數據,經過getData(dataType:string)
來獲取傳送的數據.可設置文本、html類型、url類型等。 步驟以下:java
let dragEle = document.querySelector('#drag-ele');
let dropTarget = document.querySelector('#drop-target');
dragEle.addEventListener('dragstart',event=>{
event.dataTransfer.setData('text/plain','i love you')
})
dropTarget .addEventListener('dragover',event=>{
//取消默認事件,激活drop
event.preventDefault();
})
dropTarget .addEventListener('drop',event=>{
let data = event.dataTransfer.getData('text/plain');
console.log(data);// 'i love you'
})
複製代碼
在拖拽過程當中,瀏覽器默認了一些效果,能夠經過設置dataTransfer的一些屬性或方法達到美觀效果。git
dragstart階段配置:setDragImage(img:element,offsetX:number,offsetY:number)
github
let imgEle = document.querySelector('#img-ele')
dragEle.addEventListener('dragstart',event=>{
//計算圖片的高度和寬度的一半,做爲x、y軸的偏移,使圖片居中
var offsetX = parseFloat(getComputedStyle(imgEle ).width)/2;
var offsetY = parseFloat(getComputedStyle(imgEle ).height)/2;
event.dataTransfer.setDragImage(imgEle ,offsetX,offsetY);
})
複製代碼
此處意義不是特別大,通常默認就好了。express
容許釋放的類型(僅做爲提示效果,並不作真正的限制).後端
effectAllowed
)dropEffect
)dragEle.addEventListener('dragstart',event=>{
event.dataTransfer.effectAllowed = 'copy';//設置複製類型
})
dropTarget .addEventListener('dragover',event=>{
//取消默認事件,激活drop
event.preventDefault();
})
dropTarget .addEventListener('drop',event=>{
event.dataTransfer.dropEffect = 'copy';//必須容許上面設置的copy類型
//設置爲all容許全部,也是ok的。
})
複製代碼
拖拽上傳功能應該是最有用的了,本文使用formData上傳文件。以express舉例說明。 與普通拖拽並沒有二致,能夠從桌面、資源管理器中拖動文件釋放到對應的元素上。瀏覽器
注意:app
dragover
、drop
中阻止默認行爲:preventDefault.dragTarget.addEventListener('dragover',event=>{
//阻止默認行爲
event.preventDefault();
})
dragTarget.addEventListener('drop',event=>{
//阻止文件打開默認行爲
event.preventDefault();
let file = event.dataTransfer.files[0];
var formData = new FormData();
formData.append('book',file);
var xhr = new XMLHttpRequest();
xhr.open('post','http://localhost:8080/profile');
xhr.send(formData)
})
複製代碼
關於後端express的代碼上傳到了github,如須要請自取。post
拖拽事件對象的dataTransfer對象,都是些實用的功能,不復雜,寫幾遍應該都能掌握。囿於水平有限,勘誤在所不免,望讀者朋友留言指正交流,謝謝啦!