drag & drop 拖拽事件

2019-10-7 16:07| 作者: admin| 查看: 155| 评论: 0|来自: 蚂蚁部落

本文将对 HTML5 拖拽操作中涉及的事件进行一下概述。

并不会对每一个事件的用法进行详细分析,具体参阅本版块的相关文章。

一.事件所属元素:

完整的拖动涉及两个元素或者说两大类元素。

(1).源元素,也就是被拖动元素。

(2).目标元素,源元素将被拖拽到其中。

简单代码实例如下:

[HTML] 纯文本查看 复制代码运行代码
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style type="text/css">
p{
  width:100px;
  height:50px;
  background-color:red;
}
#box {
  width:300px; 
  height:100px;
  background-color:#ccc;
}
</style>
<script>
window.onload = (ev) => {
  let odiv=document.getElementById("box");
  let op=document.getElementById("p");
 
  op.ondragstart = (ev) => {
    ev.dataTransfer.setData("Text",ev.target.id);
  }
 
  odiv.ondragover = (ev) => {
    ev.preventDefault();
  }
 
  odiv.ondrop = (ev) => {
    ev.preventDefault();
    let data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
  }
}
</script>
</head>
<body>
<p draggable="true" id="p"></p>
<div id="box"></div>
</body>
</html>

上述代码可以将红色矩形拖拽到灰色矩形中。

所以,红色矩形就是源元素,灰色矩形是目标元素。

当前标准具有总共存在七个事件,所属元素如下:

1.源元素上触发的事件:

(1).dragstart:当源元素开始拖动时触发。

(2).drag:源元素拖动过程中持续触发。

(3).dragend:当拖动操作的鼠标松开时触发此事件,无论是否位于目标元素内。

2.目标元素上触发的事件:

(1).dragenter:当拖动操作的鼠标指针进入目标元素时触发。

(2).dragover:当拖动操作的鼠标指针在目标元素内移动时触发。

(3).dragleave:当拖动操作的鼠标指针离开目标元素时触发。

(4).drop:当拖动操作的鼠标指针位于目标元素内,并松开鼠标时触发。

二.事件触发顺序:

拖拽事件的触发遵循一定的顺序,首先给出先后顺序:

(1).dragstart

(2).drag

(3).dragenter

(4).dragover

(5).dragleave

(6).drop

(7).dragend

当然这个顺序要灵活看待,比如拖动源元素经过目标元素,然后直接拖出。

此时就不会有drop事件的触发,整个过程也就没有drop事件的触发。

如果拖动源元素进入目标元素,并成功放下,此时没有dragleave事件的触发。

但是总体而言,事件的触发是遵循上述顺序,代码实例演示如下:

[HTML] 纯文本查看 复制代码运行代码
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style type="text/css">
p{
  width:100px;
  height:50px;
  background-color:red;
}
#box {
  width:300px; 
  height:100px;
  background-color:#ccc;
}
</style>
<script>
window.onload = (ev) => {
  let odiv=document.getElementById("box");
  let op=document.getElementById("p");
 
  // 源元素
  op.ondragstart = (ev) => {
    ev.dataTransfer.setData("Text",ev.target.id);
    console.log("蚂蚁部落一");
  }
  op.ondrag = (ev) => {
    console.log("蚂蚁部落二");
  }
  op.ondragenter = (ev) => {
    console.log("蚂蚁部落三");
  }

  // 目标元素
  odiv.ondragover = (ev) => {
    ev.preventDefault();
    console.log("蚂蚁部落四");
  }
  odiv.ondragleave = (ev) => {
    console.log("蚂蚁部落六");
  }
  odiv.ondrop = (ev) => {
    ev.preventDefault();
    let data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
    console.log("蚂蚁部落五");
  }
  odiv.ondragend = (ev) => {
    ev.preventDefault();
    console.log("蚂蚁部落七");
  }
}
</script>
</head>
<body>
<p draggable="true" id="p"></p>
<div id="box"></div>
</body>
</html>

大家可以打开控制台,然后拖拽元素自行测试观察。


鲜花

握手

雷人

路过

鸡蛋

最新评论

返回顶部