HTML 中的拖放

Adobe AIR 1.0 和更高版本

若要将数据拖入和拖出基于 HTML 的应用程序(或者拖入和拖出 HTMLLoader 中显示的 HTML),则可以使用 HTML 拖放事件。使用 HTML 拖放 API,可以拖到和拖出 HTML 内容中的 DOM 元素。

注: 还可以通过侦听包含 HTML 内容的 HTMLLoader 对象上发生的事件,来使用 AIR NativeDragEvent 和 NativeDragManager API。但是,HTML API 更好地与 HTML DOM 集成到了一起,因而您可以控制默认行为。NativeDragEvent 和 NativeDragManager API 在基于 HTML 的应用程序中不经常使用,因此在 针对 HTML 开发人员的 Adobe AIR API 参考 中未提供。有关使用这些类的更多信息,请参阅 Adobe ActionScript 3.0 开发人员指南 和 用于 Adobe Flash Platform 的 ActionScript 3.0 参考 。

默认的拖放行为

HTML 环境为涉及文本、图像和 URL 的拖放手势提供了默认行为。利用默认行为,始终都可以将这些类型的数据拖出元素。但是,只能将文本拖入元素,并且只能拖到页面的可编辑区域内的元素。在页面的可编辑区域之间或可编辑区域内部拖动文本时,默认行为会执行移动动作。从不可编辑的区域或应用程序外部向可编辑区域拖动文本时,默认行为则会执行复制动作。

可以通过自行处理拖放事件来覆盖默认行为。若要取消默认行为,必须调用为拖放事件调度的对象的 preventDefault() 方法。这样,您就可以根据需要将数据插入放置目标以及从拖动源中删除数据,以便执行所选的动作。

默认情况下,用户可以选择和拖动任何文本,并可以拖动图像和链接。可以使用 WebKit CSS 属性 -webkit-user-select 来控制任何 HTML 元素的选择方式。例如,如果将 -webkit-user-select 设置为 none ,则元素内容是不可选择的,因而也无法拖动。还可以使用 -webkit-user-drag CSS 属性控制元素作为一个整体是否可以拖动。不过,元素的内容则单独处理。用户仍可以拖动文本的选定部分。有关详细信息,请参阅 AIR 中的 CSS 。

HTML 中的拖放事件

从中发起拖动操作的启动器元素调度的事件有:

事件

说明

dragstart

在用户启动拖动手势时调度。如有必要,此事件的处理函数可以通过调用事件对象的 preventDefault() 方法来阻止拖动。若要控制是否可以复制、链接或移动所拖动的数据,请设置 effectAllowed 属性。所选的文本、图像和链接由默认行为放置到剪贴板上,但您可以使用事件对象的 dataTransfer 属性为拖动手势设置其他数据。

drag

在执行拖动手势期间持续调度

dragend

在用户释放鼠标按键终止拖动手势时调度。

由拖动目标调度的事件有:

事件

说明

dragover

当拖动手势仍然在元素边界内时持续调度。此事件的处理函数应设置 dataTransfer.dropEffect 属性,以指示在用户释放鼠标时放置操作是否会导致复制、移动或链接动作。

dragenter

在拖动手势进入元素的边界内时调度。

如果在 dragenter 事件处理函数中更改 dataTransfer 对象的任何属性,则这些更改将很快被下一个 dragover 事件覆盖。另一方面,在 dragenter 与第一个 dragover 事件之间有一个短暂的延迟,如果设置了不同的属性,此延迟可导致光标闪烁。在很多情况下,都可以对这两个事件使用相同的事件处理函数。

dragleave

在拖动手势离开元素边界时调度。

drop

在用户将数据放到元素上时调度。只能在此事件的处理函数内访问所拖动的数据。

为响应这些事件而调度的事件对象与鼠标事件类似。可以使用诸如 ( clientX , clientY ) 和 ( screenX , screenY ) 等鼠标事件属性来确定鼠标位置。

拖动事件对象最重要的属性是 dataTransfer ,此属性包含被拖动的数据。 dataTransfer 对象本身具有以下属性和方法:

属性或方法

说明

effectAllowed

拖动源允许的效果。通常情况下,dragstart 事件的处理函数设置此值。请参阅 HTML 中的拖动效果 。

dropEffect

由目标或用户选择的效果。如果在 dragover 或 dragenter 事件处理函数中设置 dropEffect ,则 AIR 会更新鼠标光标,以指示在用户释放鼠标时出现的效果。如果允许的效果中没有一种效果与 dropEffect 设置匹配,则不允许放置,并显示 不可用 光标。如果尚未设置 dropEffect 来响应最新的 dragover 或 dragenter 事件,则用户可以使用标准的操作系统功能键从允许的效果中进行选择。

最终的效果由为 dragend 调度的对象的 dropEffect 属性报告。如果用户通过在符合条件的目标外部释放鼠标放弃放置操作,则 dropEffect 将设置为 none 。

类型

一个数组,其中包含了 dataTransfer 对象中存在的每种数据格式的 MIME 类型字符串。

getData(mimeType)

以 mimeType 参数指定的格式获取数据。

只能为响应 drop 事件调用 getData() 方法。

setData(mimeType)

以 mimeType 参数指定的格式向 dataTransfer 添加数据。可以通过对每种 MIME 类型调用 setData() ,以多种格式添加数据。将清除由默认拖动行为放入 dataTransfer 对象的所有数据。

只能为响应 dragstart 事件调用 setData() 方法。

clearData(mimeType)

清除采用 mimeType 参数指定的格式的所有数据。

setDragImage(image, offsetX, offsetY)

设置自定义拖动图像。只能为响应 dragstart 事件,且只有当拖动整个 HTML 元素(通过将 -webkit-user-drag CSS 样式设置为 element )时,才可以调用 setDragImage() 方法。 image 参数可以是 JavaScript 元素或 Image 对象。

用于 HTML 拖放的 MIME 类型

与 HTML 拖放事件的 dataTransfer 对象一起使用的 MIME 类型包括:

数据格式

MIME 类型

文本

"text/plain"

HTML

"text/html"

URL

"text/uri-list"

位图

"image/x-vnd.adobe.air.bitmap"

文件列表

"application/x-vnd.adobe.air.file-list"

还可以使用其他 MIME 字符串,包括应用程序定义的字符串。但是,其他应用程序可能无法识别或使用所传输的数据。以所需格式向 dataTransfer 对象添加数据的工作由您负责完成。

重要说明: 只有在应用程序沙箱中运行的代码才能访问放置的文件。如果试图在非应用程序沙箱内读取或设置 File 对象的任何属性,则会产生安全错误。有关详细信息,请参阅 在非应用程序 HTML 沙箱中处理文件放置 。

HTML 中的拖动效果

拖动手势的启动器可以通过在 dragstart 事件的处理函数中设置 dataTransfer.effectAllowed 属性,来限制允许的拖动效果。可以使用以下字符串值:

字符串值

说明

"none"

不允许任何拖动操作。

"copy"

将数据复制到目标位置,并保留原始数据的位置不变。

"link"

使用指回原始数据的链接与放置目标共享数据。

"move"

将数据复制到目标,并将其从原始位置删除。

"copyLink"

可以复制数据,也可链接数据。

"copyMove"

可以复制数据,也可移动数据。

"linkMove"

可以链接数据,也可移动数据。

"all"

可以复制数据、移动数据,也可链接数据。当您阻止默认行为时, All 是默认效果。

拖动手势的目标可以设置 dataTransfer.dropEffect 属性,以指示在用户完成放置后采取的动作。如果放置效果是允许的动作之一,则系统将显示相应的复制、移动或链接光标。如果不是,则系统将显示 不可用 光标。如果目标未设置放置效果,则用户可以使用功能键从允许的动作中进行选择。

同时在 dragover 和 dragenter 事件的处理函数中设置 dropEffect 值:

function doDragStart(event) { 
    event.dataTransfer.setData("text/plain","Text to drag"); 
    event.dataTransfer.effectAllowed = "copyMove"; 
} 
 
function doDragOver(event) { 
    event.dataTransfer.dropEffect = "copy"; 
} 
 
function doDragEnter(event) { 
    event.dataTransfer.dropEffect = "copy"; 
}
注: 尽管您始终都应在 dragenter 的处理函数中设置 dropEffect 属性,但要注意,下一个 dragover 事件会将此属性重置为其默认值。设置 dropEffect 以响应这两个事件。