javascript html5輕松實(shí)現(xiàn)拖動(dòng)功能
拖放(drag和drop)是html5標(biāo)準(zhǔn)組成,下面我們從五個(gè)方面對其進(jìn)行敘述,分別是如何成為拖動(dòng)物體,如何成為拖動(dòng)目標(biāo),拖動(dòng)物體上擁有的事件,拖動(dòng)目標(biāo)上擁有的事件以及拖放物體間如何傳遞信息。
拖動(dòng)物體上擁有的事件
- dragstart (在物體剛被拖動(dòng)時(shí)觸發(fā))
- drag (在dragstart事件觸發(fā)之后就被觸發(fā))
- dragend (拖動(dòng)事件結(jié)束時(shí)觸發(fā))
拖動(dòng)目標(biāo)上擁有的事件
- dragenter (當(dāng)拖拽元素進(jìn)入放置目標(biāo)時(shí)觸發(fā))
- dragover (當(dāng)拖拽元素在放置目標(biāo)中移動(dòng)時(shí)觸發(fā),類似于mouseover)
- drop (當(dāng)拖拽元素放置在放置目標(biāo)中時(shí)觸發(fā))
如何成為拖動(dòng)物體
在html中img元素默認(rèn)可以進(jìn)行拖拽,其它元素需要設(shè)置draggable=true,即可對其進(jìn)行拖拽。
<div draggable="true"></div>
如何成為拖動(dòng)目標(biāo)
html中,元素默認(rèn)不能成為放置目標(biāo),只有我們禁止了drapenter和drapover事件的默認(rèn)行為時(shí),可以稱為拖放目標(biāo)。
droptarget.addEventListener('dragenter', function(event) { event.preventDefault(); }); droptarget.addEventListener('dragover', function(event) { event.preventDefault(); });
拖放物體間如何傳遞信息
事件中具有一個(gè)dataTransfer對象,它擁有的兩個(gè)常用方法setData()和getData(),分別用于在存放拖拽信息以及獲取拖拽信息。其中,setData()只能在拖拽事件剛開始時(shí)設(shè)置,即dragstart事件時(shí)設(shè)置,getData()則一般在放置獲取,即drop事件觸發(fā)時(shí)獲取。
// drapobj 拖拽元素 // droptarget 放置目標(biāo) dragobj.addEventListener('dragstart', function(event) { event.dataTransfer.setData('id', dragobj.id); }); droptarget.addEventListener('drop', function(event) { var id = event.dataTransfer.getData('id'); var obj = document.getElementById(id); event.preventDefault(); this.appendChild(obj); });
完整代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML5 拖拽</title> </head> <body> <div draggable="true"></div> <div style="height: 150px" id="dragobj" draggable="true"> <img src="c_06.jpg" alt=""> </div> <div id="droptarget" style="width: 150px; height: 150px;background-color: #eee;"></div> </body> <script> var droptarget = document.getElementById('droptarget'); var dragobj = document.getElementById('dragobj'); // drapobj 拖拽元素 // droptarget 放置目標(biāo) dragobj.addEventListener('dragstart', function(event) { event.dataTransfer.setData('id', dragobj.id); }); droptarget.addEventListener('dragenter', function(event) { event.preventDefault(); }); droptarget.addEventListener('dragover', function(event) { event.preventDefault(); }); droptarget.addEventListener('drop', function(event) { var id = event.dataTransfer.getData('id'); var obj = document.getElementById(id); event.preventDefault(); this.appendChild(obj); }); </script> </html>
存在問題
火狐瀏覽器中拖拽圖片默認(rèn)打開新窗口,根據(jù)javascript高級程序設(shè)計(jì)中在drop事件中禁止默認(rèn)事件,未解決問題。
解決方法:將圖片作為div的背景圖片,將div作為拖拽物體,則不存在此問題。
最終代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML5 拖拽</title> <style> div { width: 120px; height: 136px; } #dragobj { background: url('c_06.jpg') no-repeat; } #droptarget { background-color: #eee; } </style> </head> <body> <div id="dragobj" draggable="true"> </div> <div id="droptarget"></div> </body> <script> var droptarget = document.getElementById('droptarget'); var dragobj = document.getElementById('dragobj'); // drapobj 拖拽元素 // droptarget 放置目標(biāo) dragobj.addEventListener('dragstart', function(event) { event.dataTransfer.setData('id', dragobj.id); }); droptarget.addEventListener('dragenter', function(event) { event.preventDefault(); }); droptarget.addEventListener('dragover', function(event) { event.preventDefault(); }); droptarget.addEventListener('drop', function(event) { var id = event.dataTransfer.getData('id'); var obj = document.getElementById(id); event.preventDefault(); this.appendChild(obj); }); </script> </html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
原生js實(shí)現(xiàn)一個(gè)放大鏡效果超詳細(xì)
這篇文章主要介紹了原生js實(shí)現(xiàn)一個(gè)放大鏡效果超詳細(xì),文章圍繞主題展開詳細(xì)的內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09JS根據(jù)年月獲得當(dāng)月天數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了JS根據(jù)年月獲得當(dāng)月天數(shù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-07-07在 webpack 中使用 ECharts的實(shí)例詳解
這篇文章主要介紹了在 webpack 中使用 ECharts的實(shí)例代碼,需要的朋友可以參考下2018-02-02基于Javascript實(shí)現(xiàn)返回頂部按鈕
這篇文章主要為大家詳細(xì)介紹了基于Javascript實(shí)現(xiàn)返回頂部按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02javascript 處理HTML元素必須避免使用的一種方法
我們在編寫前臺(tái)頁面的時(shí)候,可能經(jīng)常會(huì)用到“javascript+數(shù)據(jù)”生成頁面元素的方法,但當(dāng)我們要處理的數(shù)據(jù)量較大,導(dǎo)致頁面需要展現(xiàn)過多的控件的時(shí)候,頁面的響應(yīng)速度也會(huì)直線下降2009-07-07詳述 Sublime Text 打開 GBK 格式中文亂碼的解決方法
這篇文章主要介紹了詳述 Sublime Text 打開 GBK 格式中文亂碼的解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10