javascript html5輕松實(shí)現(xiàn)拖動功能
拖放(drag和drop)是html5標(biāo)準(zhǔn)組成,下面我們從五個(gè)方面對其進(jìn)行敘述,分別是如何成為拖動物體,如何成為拖動目標(biāo),拖動物體上擁有的事件,拖動目標(biāo)上擁有的事件以及拖放物體間如何傳遞信息。
拖動物體上擁有的事件
- dragstart (在物體剛被拖動時(shí)觸發(fā))
- drag (在dragstart事件觸發(fā)之后就被觸發(fā))
- dragend (拖動事件結(jié)束時(shí)觸發(fā))
拖動目標(biāo)上擁有的事件
- dragenter (當(dāng)拖拽元素進(jìn)入放置目標(biāo)時(shí)觸發(fā))
- dragover (當(dāng)拖拽元素在放置目標(biāo)中移動時(shí)觸發(fā),類似于mouseover)
- drop (當(dāng)拖拽元素放置在放置目標(biāo)中時(shí)觸發(fā))
如何成為拖動物體
在html中img元素默認(rèn)可以進(jìn)行拖拽,其它元素需要設(shè)置draggable=true,即可對其進(jìn)行拖拽。
<div draggable="true"></div>
如何成為拖動目標(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)漂亮的時(shí)間選擇框效果
這篇文章主要介紹了JS實(shí)現(xiàn)漂亮的時(shí)間選擇框效果,結(jié)合實(shí)例形式分析了javascript時(shí)間選擇框插件的實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2016-08-08
區(qū)分中英文字符的兩種方法(正則和charCodeAt())
最近在為項(xiàng)目寫登錄注冊系列頁面, 表單驗(yàn)證無疑是不可缺少的部分, 在這個(gè)jQ插件滿天飛的web年代, 表單驗(yàn)證倒也不是難事. 但再好的插件, 也并不能做到十全十美2010-11-11
JS實(shí)現(xiàn)pasteHTML兼容ie,firefox,chrome的方法
這篇文章主要介紹了JS實(shí)現(xiàn)pasteHTML兼容ie,firefox,chrome的方法,涉及javascript針對頁面元素的動態(tài)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
JavaScript類的繼承多種實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript類的繼承多種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
JavaScript給每一個(gè)li節(jié)點(diǎn)綁定點(diǎn)擊事件的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript給每一個(gè)li節(jié)點(diǎn)綁定點(diǎn)擊事件的實(shí)現(xiàn)方法,包括js循環(huán)給li綁定參數(shù)不同的點(diǎn)擊事件,需要的朋友可以參考下2016-12-12
js自動閉合html標(biāo)簽(自動補(bǔ)全html標(biāo)記)
假如我有一個(gè)DIV,如果沒有閉合后面的樣式都會亂了,這樣的代碼可能會影響后面的樣式,我希望用JS去自動閉合這種沒有閉合的標(biāo)簽2012-10-10
javaScript window.event.keyCode 集合與測試方法
javaScript window.event.keyCode 集合,對于事件的代碼獲取可以用腳本監(jiān)聽來實(shí)現(xiàn)。2010-05-05

