HTML5游戏开发(七)
一.HTML5拖放
拖放(Drag 和 drop)是HTML5标准的组成部分。拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。
HTML5为所有HTML元素规定了一个draggable属性,表示元素是否可以拖动。图像和链接的draggable属性自动被设置成了true,而其它元素这个属性的默认值都是false。
二.拖放事件
在拖放的过程中会触发以下事件:
(1).在拖动目标上触发事件 (源元素):
ondragstart - 用户开始拖动元素时触发
ondrag - 元素正在拖动时触发
ondragend - 用户完成元素拖动后触发
(2).释放目标时触发的事件::
ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件
ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件
ondrop - 在一个拖动过程中,释放鼠标键时触发此事件
三.dataTransfer对象
在拖曳操作的过程中,我们可以用过dataTransfer对象来传输数据,以便在拖曳操作结束的时候对数据进行其他的操作。
(1).对象属性
dropEffect:设置或返回拖放目标上允许发生的拖放行为。如果此处设置的拖放行为不再effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性值只允许为“null”、“copy”、“link”和“move”四值之一。
effectAllowed:设置或返回被拖动元素允许发生的拖动行为。该属性值可设为“none”、“copy”、“copyLink”、“copyMove”、“link”、“linkMove”、“move”、“all”和“uninitialized”。
默认情况下,图像、链接和文本是可以拖动的,也就是说,不用额外编写代码,用户就可以拖动它们。文本只有在被选中的情况下才能拖动,而图像和链接在任何时候都可以拖动。
items:该属性返回DataTransferItems对象,该对象代表了拖动数据。
types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。
(2).对象方法
setData(format,data):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据。
该方法向dataTransfer对象中存入数据。接收两个参数,第一个表示要存入数据种类的字符串,现在支持有以下几种:
text/plain:文本文字。
text/html:HTML文字。
text/xml:XML文字。
text/uri-list:URL列表,每个URL为一行 。
第二个参数为要存入的数据。
getData(format):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。
clearData([format]):从dataTransfer对象中删除指定格式的数据,参数可选,若不给出,则为删除对象中所有的数据。
addElement(element):添加自定义图标
setDragImage(element,x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向上的距离,y设置图标与鼠标在垂直方向上的距离。
四.示例代码
<!DOCTYPE html>
<html>
<head>
<title>HTML5拖拽</title>
<meta charset="utf-8">
<style> #target { /*position: absolute;*/ width: 350px; height: 70px; padding: 10px; border: 1px solid #aaaaaa; } #source { position: absolute; width: 120px; height: 20px; background-color: #49868C; } </style>
</head>
<body>
<p>将按源对象放入容器中</p>
<div id="target">目标对象</div>
<br>
<div id="source">源对象</div>
<script type="text/javascript" src="js/drag.js"></script>
</body>
</html>
JS脚本
var source = document.querySelector('#source'),
target = document.querySelector("#target");
//添加按钮的可拖放属性
source.draggable = true;
target.draggable = true;
//----------------------源对象事件
//开始开始拖动
source.addEventListener('dragstart', function(ev) {
//设置数据参数:key,value
ev.dataTransfer.setData("aa",ev.target.id);
console.log('源对象开始被拖动');
}, false)
//拖动中
source.addEventListener('drag', function(ev) {
console.log('源对象拖动中');
});
source.addEventListener('dragend', function(ev) {
console.log('源对拖动结束');
});
//---------------------目标对象
//源对象在目标对象中拖动
target.addEventListener('dragover', function(ev) {
console.log("源对象移动" + ev.x, +ev.y);
ev.preventDefault();
});
//放置事件
target.addEventListener('drop', function(ev) {
//获 取数据
var data = ev.dataTransfer.getData("aa");
if(data) {
//追加到子对象中
ev.target.appendChild(document.getElementById(data));
}
//阻止默认行为
ev.preventDefault();
console.log('已放入源对象');
}, false);
//源对象进入
target.addEventListener('dragenter', function(ev) {
this.style.backgroundColor = "green";
console.log("源对象进入");
ev.preventDefault();
});
//源对象离开目标对象
target.addEventListener('dragover', function(ev) {
console.log("源对象离开");
ev.preventDefault();
});
//--------------------------父级目标对象
//文档容器对象
document.ondragover = function(ev) {
console.log("*父容器" + ev.x + ":" + ev.y)
ev.preventDefault();
}
document.ondrop = dropObjHandler;
function dropObjHandler(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("aa");
//克隆节点
var item = document.getElementById(data).cloneNode();
//获取事件目标对象
ev.target.appendChild(document.getElementById(data));
//ev.target.appendChild(item);
}
显示效果:
五.兼容
在 ios 和安卓上,完全不兼容,需要兼容插件:
可以从以下git下载:
https://github.com/timruffles/ios-html5-drag-drop-shim