拖放(DnD)是强大的用户界面概念,通过单击鼠标,可以轻松地复制,重新排序和删除项目,这允许用户在元素上方单击并按住鼠标按钮,将其拖动到另一个位置,然后释放鼠标按钮以将元素放到那里。
要使用传统的HTML4实现拖放函数,开发人员要么不得不使用复杂的JavaScript编程,要么必须使用jQuery等其他JavaScript框架。
现在,HTML 5提供了拖放(DnD)API,该API为浏览器带来了本机DnD支持,从而使编写代码变得更加容易。
所有主要的浏览器(例如Chrome,Firefox 3.5和Safari 4等)都支持HTML 5 DnD。
拖放事件
在拖放操作的各个阶段都会触发许多事件。这些事件在下面列出-
Sr.No. | Events & Remark |
---|---|
1 |
dragstart 当用户开始拖动对象时触发。 |
2 |
dragenter 在发生拖动时将鼠标第一次移到目标元素上时触发。 |
3 |
dragover 发生拖动时,将鼠标移到元素上时将触发此事件。 |
4 |
dragleave 当鼠标在拖动时离开元素时,将触发此事件。 |
5 |
drag 在拖动对象时每次移动鼠标都会触发。 |
6 |
drop 在拖动操作结束时,在发生放置的元素上触发放置事件。 |
7 |
dragend 当用户在拖动对象时释放鼠标按钮时触发。 |
DataTransfer对象
所有拖放事件的事件侦听器方法都接受 Event 对象,该对象具有名为 dataTransfer 的只读属性。
event.dataTransfer 返回与事件关联的 DataTransfer 对象,如下所示-
function EnterHandler(event) { DataTransfer dt=event.dataTransfer; ............. }
DataTransfer 对象保存有关拖放操作的数据。可以根据与DataTransfer对象关联的各种属性来检索和设置此数据,如下所述-
Sr.No. | DataTransfer attributes and their description |
---|---|
1 |
dataTransfer.dropEffect [= value ]
|
2 |
dataTransfer.effectAllowed [=value]
|
3 |
dataTransfer.types 返回一个DOMStringList,列出在dragstart事件中设置的格式。此外,如果要拖动任何文件,则类型之一将是字符串" Files"。 |
4 |
dataTransfer.clearData([format]) 删除指定格式的数据。如果省略该参数,则删除所有数据。 |
5 |
dataTransfer.setData(format,data) 添加指定的数据。 |
6 |
data=dataTransfer.getData(format) 返回指定的数据。如果没有这样的数据,则返回空字符串。 |
7 |
dataTransfer..files 返回要拖动的文件的FileList(如果有)。 |
8 |
dataTransfer.setDragImage(element,x,y) 使用给定的元素更新拖动反馈,以替换任何先前指定的反馈。 |
9 |
dataTransfer.addElement(element) 将给定元素添加到用于呈现拖动反馈的元素列表中。 |
拖放示例
以下是实现拖放操作要执行的步骤-
第1步- 创建Draggable对象
这是要采取的步骤-
如果要拖动元素,则需要将该元素的 draggable 属性设置为 true 。
为 dragstart 设置一个事件侦听器,该事件侦听器存储要拖动的数据。
事件监听器 dragstart 将设置允许的效果(复制,移动,链接或某种组合)。
以下是使对象可拖动的示例-
<!DOCTYPE HTML> <html> <head> <style type="text/css"> #boxA, #boxB { float:left;padding:10px;margin:10px; -moz-user-select:none; } #boxA { background-color: #6633FF; width:75px; height:75px; } #boxB { background-color: #FF6699; width:150px; height:150px; } </style> <script type="text/javascript"> function dragStart(ev) { ev.dataTransfer.effectAllowed='move'; ev.dataTransfer.setData("Text", ev.target.getAttribute('id')); ev.dataTransfer.setDragImage(ev.target,0,0); return true; } </script> </head> <body> <center> <h2>Drag and drop HTML5 demo</h2> <div>Try to drag the purple box around.</div> <div id="boxA" draggable="true" ondragstart="return dragStart(ev)"> <p>Drag Me</p> </div> <div id="boxB">Dustbin</div> </center> </body> </html>
这将产生以下输出-
第2步- 拖入目标
要接受放置,放置目标必须侦听至少三个事件。
dragenter event,该事件用于确定放置目标是否接受放置。
dragover event,用于确定向用户显示哪些反馈。
最后,是 drop 事件,它允许执行实际的放置。
以下是将对象放入另一个对象的示例-
<html> <head> <style type="text/css"> #boxA, #boxB { float:left;padding:10px;margin:10px;-moz-user-select:none; } #boxA { background-color: #6633FF; width:75px; height:75px; } #boxB { background-color: #FF6699; width:150px; height:150px; } </style> <script type="text/javascript"> function dragStart(ev) { ev.dataTransfer.effectAllowed='move'; ev.dataTransfer.setData("Text", ev.target.getAttribute('id')); ev.dataTransfer.setDragImage(ev.target,0,0); return true; } function dragEnter(ev) { event.preventDefault(); return true; } function dragOver(ev) { return false; } function dragDrop(ev) { var src=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(src)); ev.stopPropagation(); return false; } </script> </head> <body> <center> <h2>Drag and drop HTML5 demo</h2> <div>Try to move the purple box into the pink box.</div> <div id="boxA" draggable="true" ondragstart="return dragStart(event)"> <p>Drag Me</p> </div> <div id="boxB" ondragenter="return dragEnter(event)" ondrop="return dragDrop(event)" ondragover="return dragOver(event)">Dustbin</div> </center> </body> </html>
这将产生以下输出-