热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTML5游戏开发(七)

HTML5游戏开发(七)一.HTML5拖放  拖放(Drag和drop)是HTML5标准的组成部分。拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在HTML5中,拖放是

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设置图标与鼠标在垂直方向上的距离。

四.示例代码


<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);
}

显示效果:
image

五.兼容

在 ios 和安卓上,完全不兼容,需要兼容插件:
可以从以下git下载:
https://github.com/timruffles/ios-html5-drag-drop-shim


推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • JavaScript中属性节点的类型及应用
    本文深入探讨了JavaScript中属性节点的不同类型及其在实际开发中的应用,帮助开发者更好地理解和处理HTML元素的属性。通过具体的案例和代码示例,我们将详细解析如何操作这些属性节点。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
author-avatar
enbel2012_707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有