HTML5中提供了直接的拖放API,而不用复杂的处理鼠标点击事件实现拖放,这大大简化了拖放相关操作的代码。
但是要注意,拖放API兼容性很差,浏览器实现有各种各样的不同bug,因此仅适用于简单的业务逻辑,不可用于过于复杂的交互效果。复杂交互最好使用Canvas,按照类似游戏引擎的形式自行实现。
拖放示例代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Demo</title>
</head>
<body>
<span id="drag_me_1" style="width: 50px; height: 20px; background-color: red;" draggable="true">请拖放</span>
<span id="drag_me_2" style="width: 50px; height: 20px; background-color: blue;" draggable="true">请拖放</span>
<span id="drag_me_3" style="width: 50px; height: 20px; background-color: green;" draggable="true">请拖放</span>
<div id="target" style="width: 640px; height: 480px; border: solid black 1px;"></div>
<script>
var drag_me_1 = document.querySelector("#drag_me_1");
var drag_me_2 = document.querySelector("#drag_me_2");
var drag_me_3 = document.querySelector("#drag_me_3");
var target = document.querySelector("#target");
document.addEventListener("dragover", function(event)
{
event.preventDefault();
});
document.addEventListener("drop", function(event)
{
event.preventDefault();
});
drag_me_1.addEventListener("dragstart", function(event)
{
var dt = event.dataTransfer;
dt.effectAllowed = "all";
dt.setData("text/plain", "1");
});
drag_me_2.addEventListener("dragstart", function(event)
{
var dt = event.dataTransfer;
dt.effectAllowed = "all";
dt.setData("text/plain", "2");
});
drag_me_3.addEventListener("dragstart", function(event)
{
var dt = event.dataTransfer;
dt.effectAllowed = "all";
dt.setData("text/plain", "3");
});
target.addEventListener("dragend", function(event)
{
event.preventDefault();
});
target.addEventListener("drop", function(event)
{
var dt = event.dataTransfer;
var text = dt.getData("text/plain");
var drag_me_copy;
if(text == "1")
{
drag_me_copy = drag_me_1.cloneNode(true);
target.appendChild(drag_me_copy);
}
if(text == "2")
{
drag_me_copy = drag_me_2.cloneNode(true);
target.appendChild(drag_me_copy);
}
if(text == "3")
{
drag_me_copy = drag_me_3.cloneNode(true);
target.appendChild(drag_me_copy);
}
event.preventDefault();
event.stopPropagation();
});
</script>
</body>
</html>
该程序可以拖动三个span进入下方div,拖动时,span的序号存入dataTransfer,拖动完成后读取序号,决定将哪个span显示在下方div中。
在被拖放元素dragstart回调时,调用setDragImage(),可以向dataTransfer传入自定义拖放图标,参数是Element类型,实际上拖放图标的img元素不需要在html中定义,直接使用document.createElement()创建元素即可。
为上述代码添加拖放图标例子:
drag_me_1.addEventListener("dragstart", function(event)
{
var icon = document.createElement("img");
icon.src = "icon.jpg";
var dt = event.dataTransfer;
dt.effectAllowed = "all";
dt.setDragImage(icon, 0, 0);
dt.setData("text/plain", "1");
});