`
lucifinilhades
  • 浏览: 86010 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

HTML5 拖放API

阅读更多

在HTML5中,已经支持在浏览器与其他应用程序之间的数据互相拖动,同时也大大简化了有关于拖放方面的代码。

实现拖放的步骤

在HTML5中要想实现拖放操作,至少要经过两个步骤:

  1. 将想要拖放的对象元素的draggable属性设为true(draggable="true")。这样才能将该元素进行拖放。另外,img元素和a元素(必须指定href属性)默认允许拖放。
  2. 编写与拖放有关的事件处理代码。关于拖放存在的几个事件如下所示。
拖放的相关事件
事件
产生事件的元素
描述
dragstart
被拖放的元素。
开始拖放操作。
drag
被拖放的元素。
拖放过程中。
dragenter
拖放过程中鼠标经过的元素。
被拖放的元素开始进入本元素的范围内。
dragover
拖放过程中鼠标经过的元素。 被拖放的元素正在本元素范围内移动。
dragleave
拖放过程中鼠标经过的元素。 被拖放的元素离开本元素的范围。
drop
拖放的目标元素。
有其他元素被拖放到了本元素中。
dragend
拖放的目标元素。
拖放操作结束。

拖放示例如下,为使用方便,为jQuery增加如下函数:

jQuery.fn.dragstart = function(handler) {
	return this.each(function() {
		this.addEventListener("dragstart", handler, false);
	});
};

jQuery.fn.drag = function(handler) {
	return this.each(function() {
		this.addEventListener("drag", handler, false);
	});
};

jQuery.fn.dragenter = function(handler) {
	return this.each(function() {
		this.addEventListener("dragenter", handler, false);
	});
};

jQuery.fn.dragover = function(handler) {
	return this.each(function() {
		this.addEventListener("dragover", handler, false);
	});
};

jQuery.fn.dragleave = function(handler) {
	return this.each(function() {
		this.addEventListener("dragleave", handler, false);
	});
};

jQuery.fn.drop = function(handler) {
	var handler1 = function(event) {
		handler(event);
		event.preventDefault();
		event.stopPropagation();
	};
	return this.each(function() {
		this.addEventListener("drop", handler, false);
	});
};

jQuery.fn.dragend = function(handler) {
	var handler1 = function(event) {
		handler(event);
		event.preventDefault();
	};
	return this.each(function() {
		this.addEventListener("dragend", handler, false);
	});
};

拖放操作所使用的示例HTML页面代码如下:

<!DOCTYPE html>
<html lang="zh-cn" dir="ltr">
  <head>
    <meta charset="UTF-8" />
    <title>施放示例</title>
    <script type="text/javascript" src="../js/jquery-1.6.4.js"></script>
    <script type="text/javascript" src="../js/dragdrop.js"></script>
  </head>
  <body>
    <h1>简单拖放示例</h1>
    <div id="dragme" draggable="true" style="width:200px; border:1px solid gray; ">请施放</div>
    <div id="text" style="width:200px; height:200px; border:1px solid gray; "></div>
  </body>
</html>

进行拖放操作的JavaScript代码如下:

$(function() {
 	$(document).dragover(function(event) {
		event.preventDefault();
	});

	$("#dragme").dragstart(function(event) {
		var dt = event.dataTransfer;
		dt.effectAllowed = 'all';
		dt.setData("text/plain", "Hello World.");
	});
	
	$("#text").dragend(function(event) {}).drop(function(event) {
		var dt = event.dataTransfer;
		var text = dt.getData("text/plain");
		$(this).append(text);
	}); 
});

代码要点说明:

  • 开始拖动(dragstart事件发生)时,把要拖动的数据存入DataTransfer对象(setData()方法)。DataTransfer对象专门用来存放拖放时要携带的数据,它可以被设置为拖动事件对象的dataTransfer属性。setData()方法中的第一个参数为携带数据的数据各类的字符串,第二个参数为要携带的数据。第一个参数中表示数据各类的字符串里只能填入类似“text/plain”或“text/html”的表示MIME类型的文字,不能填入其他文字。
  • 如果把“dt.setData("text/plain", "Hello World.")”改为“dt.setData("text/plain", this.id)”,因为把被拖动元素的id当成了参数,所以携带的数据就是被拖动元素中的数据了,因为浏览器在使用getData()方法读取数据时会自动读取该元素中的数据。
  • 针对拖放的目标元素,必须在dragend或dragover事件内调用“event.preventDefault()”方法。因为默认情况下,拖放的目标元素是不允许接受元素的,为了把元素拖放到其中,必须把默认处理关闭。
  • 目标元素接受到被拖放的元素后,执行getData()方法从DataTransfer那里获得数据。getData()方法的参数为setData()方法中指定的数据种类。
  • 要实现拖放过程,还必须在目标元素的drop事件中关闭默认处理(拒绝被拖放),否则目标元素不能接受被拖放的元素。
  • 要实现拖放过程,还必须设定整个页面为不执行默认处理(拒绝被拖放),否则拖放处理也不能被实现。因为页面是先于其他元素接受拖放的,如果页面上拒绝拖放,则页面上其他元素就都不能接受拖放了。
  • 要使用元素可以被拖放,首先必须把该元素的draggable属性设为true。另外,为了让这个示例在所有支持拖放API的浏览器中都能正常运行,需要指定“-webkit-user-drag:element”这种Webkit特有的CSS属性。
  • 本示例中的数据种类使用了“text/plain”这个MIME类型,也可以从其他使用同样MIME类型的应用程序中把该类型的数据拖动到目标元素中。现在支持拖动处理的MIME的类型有:“text/plain(文本文字)”、“text/html(HTML文字)”、“text/xml(XML文字)”、“text/uri-list(URL列表,每个URL为一行)”。

DataTransfer对象的属性与方法

如果DataTransfer对象的属性和方法使用得好,可以实现定制拖放图标,让它只支持特定拖放(例如复制、移动等),甚至可以实现更复杂的拖放操作:

  • dropEffect属性:表示拖放操作的视觉效果,允许对其进行值的设定。该效果必须在用effectAllowed属性指定的允许的视觉效果的范围内,允许指定的值为none、copy、link、move。
  • effectAllowed属性:用来指定当元素被拖放时所允许的视觉效果,可以指定的值为:none、copy、copyLink、copyMove、link、linkMove、move、all、unintialize。
  • type属性:存入数据的种类,字符串的伪数组。
  • void clearData(DOMString format)方法:清除DataTransfer对象中存放的数据,如果省略参数,则清除全部数据。
  • void setData(DOMString format, DOMString data)方法:向DataTransfer对象内存入数据。
  • DOMString getData(DOMString format)方法:从DataTransfer对象中读数据。
  • void setDragImage(Element image, long x, long y)方法:用img元素来设置拖放图标(部分浏览器中可以用canvas等其他元素来设置)。

setData()方法在拖放开始时向dataTransfer对象中存入数据,它用type属性来指定数据MIME类型,而getData()方法在拖动结束时读取dataTransfer对象中的数据。clearData()方法可以用来清除DataTransfer对象内的数据。

设定拖放时的视觉效果

dropEffect属性与effectAllowed属性结合起来可以设定拖放时的视觉效果。effectAllowed属性表示当一个元素被拖动时所允许的视觉效果,一般在ondragstart事件中设定,允许设定的值为none、copy、copyLink、copyMove、link、linkMove、move、all、unintialize。dropEffect属性表示实际拖放时的视觉效果,一般在ondragover事件中指定,允许设定的值为none、copy、link、move。dropEffect属性所表示的实际视觉效果必须在effectAllowed属性所表示的允许的视觉效果范围内。规则如下所示:

  1. 如果effectAllowed属性设定为none,则不允许拖放元素。
  2. 如果不dropEffect属性设定为none,则不允许被拖放到目标元素中。
  3. 如果effectAllowed属性设定为all或不设定,则dropEffect属性允许被设定为任何值,并且按指定的视觉效果进行显示。
  4. 如果effectAllowed属性设定为具体效果(不为none、all),dropEffect属性也设定了具体视觉效果,则两个具体效果值必须完全相等,否则不允许将被拖放元素拖放到目标元素中。
$("#dragme").dragstart(function(event) {
    var dt = event.dataTransfer;
    dt.effectAllowed = 'copy';
    dt.setData("text/plain", "Hello.");
});

$("#text").dragover(function(event) {
    var dt = event.dataTransfer;
    dt.dropEffect = 'copy';
    event.preventDefault();
});

自定义拖放图标

除了上面所说的使用effectAllowed属性与dropEffect属性外,HTML5中还允许自定义拖放图标——指的是在用鼠标拖动元素的过程中,位于鼠标指针下部的小图标。

DataTransfer对象有一个setDragImage()方法,该方法有三个参数,第一个参数image设定为拖放图标的图标元素,第二个参数为拖放图标离鼠标指针的x轴方向的位移量,第三个参数是拖放图标离鼠标指针的y轴方向的位移量。

$('#dragme').dragstart(function(event) {
    var dt = event.dataTransfer;
    dt.setDragImage($('img').attr("src", "images/img1.jpg")[0], -10, -10);
    dt.setData("text/plain", "Welcome");
});
分享到:
评论

相关推荐

    HTML5 拖放API:简化网页交互的现代方法

    HTML5 引入了拖放API,这是一个允许用户通过拖拽动作在网页上移动元素的功能。这项API极大地丰富了网页的交互性,使得用户可以更直观地与网页内容进行交互。本文将详细介绍如何使用HTML5的拖放API,包括基本用法和...

    HTML5拖放API项目.rar

    仿回收站效果的设计与实现:在Windows等操作系统中均包含回收站功能,用户可以直接将不需要的文件拖拽并放置到桌面回收站图标上以实现文件删除。 图片相框展示的设计与实现:目前市面上一些修图工具软件带有自动为图片...

    【JavaScript源代码】如何在vue中使用HTML 5 拖放API.docx

    HTML5的拖放API提供了一系列事件来处理拖放操作,如`dragstart`、`dragover`、`dragenter`、`dragleave`、`drop`等。在Vue中,我们需要监听这些事件并在Vue实例的方法中处理。 在`Card.vue`中,我们需要: - 使用`...

    使用HTML5拖放API修改列表的Vue组件

    在这个主题中,我们将深入探讨如何使用HTML5的拖放API与Vue.js结合,构建一个可拖放的列表组件。 首先,我们需要了解HTML5的拖放API的基本概念。拖放API主要由几个事件和数据传输对象组成: 1. `dragstart`:当...

    HTML5拖放API项目.zip

    仿回收站效果的设计与实现:在Windows等操作系统中均包含回收站功能,用户可以直接将不需要的文件拖拽并放置到桌面回收站图标上以实现文件删除。 图片相框展示的设计与实现:目前市面上一些修图工具软件带有自动为图片...

    vue拖放列表::horse_face:Vue指令,用于使用HTML5拖放API修改列表

    Vue指令允许您使用本地HTML5拖放API构建可排序列表。 支持用于构建树木和其他精美结构的嵌套列表。 :face_with_open_mouth: 现在支持2.0,请参见 :clapping_hands: :clapping_hands: 演示版 不支持VueJS 2.0 通常...

    HTML5新增拖放API.pdf

    HTML5新增的拖放API为前端开发人员提供了一种便捷的方式,使得网页元素能够模拟现实世界中的拖拽操作,增强用户体验。以下是从给定文件中提取的相关知识点: 1. HTML5拖放API允许用户通过拖拽操作将文件或数据从一...

    RSP:一个学习 HTML5 拖放 API 的简单应用

    HTML5的拖放API是现代Web开发中的一个重要特性,它允许用户通过鼠标操作在网页上进行元素的拖放,极大地增强了交互性和用户体验。本项目"RSP:一个学习HTML5拖放API的简单应用"就是一个关于这个API的实践示例,以剪刀...

    html5文件上传使用拖放api技术项目报告

    HTML5 文件上传与拖放API技术是现代网页应用中一种常用的功能,特别是在移动应用开发中。这个项目报告详细介绍了如何利用HTML5的拖放API来实现文件上传,包括相关技术的使用和具体实现步骤。 首先,HTML5的拖放API...

    HTML5拖放API实现拖放排序的实例代码

    HTML5拖放API是HTML5标准中的一部分,它允许用户通过拖放的方式轻松地与页面元素进行交互,从而实现了拖放排序等复杂的交互功能。在实现拖放排序的实例代码中,我们首先需要了解拖放API中的几个基本概念,包括...

    HTML5拖放API实现自动生成相框功能

    HTML5的拖放API(Drag and Drop API)是一项强大的功能,允许用户直接通过鼠标操作在网页上拖动元素,极大地增强了交互性。在这个特定的例子中,我们利用HTML5的拖放API来创建一个自动生成相框的功能,用户可以从...

    html5文件拖放

    首先,我们要了解HTML5拖放API的基本组成部分: 1. **dragstart**:当用户开始拖动元素时触发此事件。 2. **drag**:在拖动过程中,只要元素还在被拖动就会持续触发。 3. **dragenter**:当被拖动元素进入可接受...

    achikochi:用于可排序项目的原生 HTML5 拖放 API jQuery 插件

    用于可排序项目的原生 HTML5 拖放 API jQuery 插件。 向前 这是一个基于原生HTML5拖放插件的插件。 我将它包装为一个 jQuery 插件并将其扩展为具有公开的 API(揭示模块模式)和回调钩子。 这是一项正在进行的工作...

    基于HTML5拖放API:目前市面上的一些修图工具软件带有自动为图片添加不同款式相框的功能,用户可以选择本地图片文件然后为其添加相框效果

    请将文件拖放至此处。 //ondragover事件回调函数 function allowDrop(ev) { //解禁当前元素为可放置被拖拽元素的区域 ev.preventDefault(); } //ondrop事件回调函数 function drop(ev) { //解禁当前元素...

    angular-drag-and-drop-lists:使用HTML5拖放API对嵌套列表进行排序的Angular指令

    Angular指令,允许您使用本机HTML5拖放API构建可排序的列表。 指令也可以嵌套以将拖放拖放到所见即所得编辑器,树或正在构建的任何奇特结构中。 :warning: 停产通知 该库是为处于 AngularJS 1.x构建的。 我建议迁移...

    API实现文件拖放.rar

    "API实现文件拖放"这个主题涉及到了Windows操作系统中的文件操作以及用户界面交互的高级功能。在Windows环境中,文件拖放是一种常见的用户交互方式,允许用户通过鼠标将一个文件从一个位置拖动到另一个位置,以完成...

    HTML5 拖放:在相册中对照片进行排序

    首先,我们需要理解HTML5拖放API的基本结构。拖放功能涉及到几个主要的事件监听器,包括`dragstart`、`dragenter`、`dragover`、`dragleave`、`drop`和`dragend`。这些事件对应于拖放操作的不同阶段,例如开始拖动、...

    HTML5新增拖放API.png

    HTML5新增拖放API.png

    react-sortable-item:重新排列列表中的元素。 使用原生 HTML5 拖放 API

    使用原生 HTML5 拖放 API。 参见。 这个库与其他 react-sortable 库的不同之处在于它将重新索引策略视为 drop 事件的实现细节。 这使得管理您的列表状态更容易。 它还可以更轻松地接受来自其他来源(其他窗口、桌面...

    react-dragtastic:一个用于React的简单拖放库,它使用更稳定的mouseDownmouseUp事件模式,而不是有问题HTML5拖放API

    一个用于React的简单拖放库,它使用更稳定的mouseDown / mouseUp模式代替有问题HTML5拖放API。 拖放界面非常复杂,难以正确编程,此程序包试图通过拖放库来减轻某些常见的麻烦。 应该注意的是,还有更成熟的解决...

Global site tag (gtag.js) - Google Analytics