HTML 拖放 API
HTML 拖放 API 允许元素被拖拽和放置。
实例
将 W3School 图片拖拽到第二个矩形中。
请把 W3School 图片拖到矩形中。
拖放
拖放是一个非常常见的功能。它指的是当您“抓住”一个对象并将其拖拽到不同位置时。
浏览器支持
表格中的数字指定了完全支持拖放的第一个浏览器版本。
| Chrome | Edge | Firefox | Safari | Opera |
|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Opera |
| 4.0 | 9.0 | 3.5 | 6.0 | 12.0 |
HTML 拖放 API 示例
下面的例子是一个简单的拖放示例:
实例
<!DOCTYPE HTML>
<html>
<head>
<script>
function dragstartHandler(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dragoverHandler(ev) {
ev.preventDefault();
}
function dropHandler(ev) {
ev.preventDefault();
const data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
</head>
<body>
<div id="div1" ondrop="dropHandler(event)" ondragover="dragoverHandler(event)"></div>
<img id="img1" src="logo.gif" draggable="true" ondragstart="dragstartHandler(event)" width="336" height="69">
</body>
</html>
它可能看起来很复杂,但让我们逐步了解拖放事件的各个部分。
使元素可拖拽
首先:要使元素可拖拽,将 draggable 属性设置为 true:
<img id="img1" draggable="true">
或:
<p id="p1" draggable="true">可拖拽的文本</p>
拖拽什么 - ondragstart 和 setData()
然后,指定当元素被拖拽时应发生什么。
在上面的示例中,<img> 元素的 ondragstart 属性调用了一个函数(dragstartHandler(ev)),该函数指定了要拖拽的数据。
dataTransfer.setData() 方法设置了拖拽数据的类型和值:
function dragstartHandler(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
在本例中,数据类型为 "text",值是可拖拽元素的 id("img1")。
放置位置 - ondragover
<div> 元素的 ondragover 属性调用了一个函数(dragoverHandler(ev)),该函数指定了拖拽数据可以放置的位置。
默认情况下,数据/元素不能放置在其他元素中。为了允许放置,我们必须阻止元素的默认处理。
这是通过为 ondragover 事件调用 preventDefault() 方法来实现的:
function dragoverHandler(ev) {
ev.preventDefault();
}
执行放置 - ondrop
当拖拽的数据被放置时,会发生一个 drop 事件。
在上面的示例中,<div> 元素的 ondrop 属性调用了一个函数,dropHandler(event):
function dropHandler(ev) {
ev.preventDefault();
const data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
代码解释:
- 调用
preventDefault()以防止浏览器对数据的默认处理(默认情况下是作为链接打开) - 使用
dataTransfer.getData()方法获取拖拽的数据。该方法将返回在setData()方法中设置的任何相同类型的数据 - 拖拽的数据是拖拽元素的 id(
"img1") - 将拖拽的元素追加到放置元素中
更多实例
实例
如何将 <h1> 元素拖放到 <div> 元素中:
<script>
function dragstartHandler(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dragoverHandler(ev) {
ev.preventDefault();
}
function dropHandler(ev) {
ev.preventDefault();
const data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
</head>
<body>
<div id="div1" ondrop="dropHandler(event)" ondragover="dragoverHandler(event)"></div>
<h1 id="h1" draggable="true" ondragstart="dragstartHandler(event)">W3School.com.cn</h1>
实例
如何将 <a> 元素拖放到 <div> 元素中:
<script>
function dragstartHandler(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dragoverHandler(ev) {
ev.preventDefault();
}
function dropHandler(ev) {
ev.preventDefault();
const data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
</head>
<body>
<div id="div1" ondrop="dropHandler(event)" ondragover="dragoverHandler(event)"></div>
<a id="link1" href="https://w3school.com.cn" draggable="true" ondragstart="dragstartHandler(event)">W3School.com.cn</a>
实例
如何将图片在两个 <div> 元素之间来回拖放: