如何在事件 Dragover 或 Dragenter 中从 DataTransfer.getData 获取数据

Posted

技术标签:

【中文标题】如何在事件 Dragover 或 Dragenter 中从 DataTransfer.getData 获取数据【英文标题】:how to get data from DataTransfer.getData in event Dragover or Dragenter 【发布时间】:2015-11-02 03:17:18 【问题描述】:

我有一个代码:

element.addEventListener('dragstart',function(e)
   e.dataTransfer.setData('Text', 'something is here');
,false);

当我在事件 Drop 中从 DataTransfer.getData 获取数据时正在运行。 但是当我想在事件 dragover 或 dragenter 中获取数据时,数据为空。

element.addEventListener('dragover',function(e)
   var a = e.dataTransfer.getData('Text');
   console.log(a);
,false);

那么,如何在事件 dragover 或 dragenter 中获取数据

【问题讨论】:

【参考方案1】:

dragstartdrop 之外,您通常无权访问有关事件的此信息。 Firefox 似乎可以让您访问,但它似乎违反了标准。

在拖放期间传输数据的方式是通过 data store 对象,该对象包含发生不同操作所需的所有信息。但是,根据您访问此数据存储的event,您可以使用此信息执行的操作有一定的限制。有3种模式,定义如下:

一种拖拽数据存储模式,为以下之一:

读/写模式

对于 dragstart 事件。可以将新数据添加到拖动数据存储中。

只读模式

对于 drop 事件。表示拖动数据的项目列表可以是 读取,包括数据。无法添加新数据。

保护模式

对于所有其他事件。拖动数据存储中的格式和种类 可以枚举表示拖动数据的项目列表,但 数据本身不可用,无法添加新数据。

https://html.spec.whatwg.org/multipage/interaction.html#the-drag-data-store

所以在拖拽时,数据存储处于保护模式,因此数据不应该可用。同样,Firefox 以不同的方式实现这一点,但无论如何您都不应该依赖它。

出于安全原因,这些模式存在,这些数据传输不仅允许传输同一页面的元素,还允许传输来自其他应用程序、文件等的数据。

【讨论】:

很遗憾,情况就是这样;如果您不知道被拖动的是什么,它会使绘制占位符并知道dataTransfer.dropEffect 应该是相当困难的。 如果您控制了拖动启动,那么您就可以访问。如果你不这样做,那么限制你可以知道的内容是有意义的,否则你可以在用户不知道的情况下访问被拖动到页面上的内容。 要从页面A跨窗口拖动到同一域内的任意页面B,我们无法从放置目标页面访问dragstart,这很粗糙。替代方案?:传递消息(但我们不知道目标页面的 URL……只是域),在 dataTransfer.types 字段中包含一些字符串类型的信息,或者在两个页面之间与服务器异步协调。跨度> dataTransfer.types 确实有助于识别拖动对象上当前存在的数据类型。因此,如果您在“dragstart”上添加了一些数据,您可以检查“dragover”中的数据类型。显然,如果您绝对需要,您也可以“破解”它并将您的整个字符串化信息存储在那里。 在同一个文档中拖动时拥有此信息会很有意义

以上是关于如何在事件 Dragover 或 Dragenter 中从 DataTransfer.getData 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

无法触发 drop 事件(是的,我在 dragover 中阻止了 Default()ed)

HTML5拖放的dragover vs dragenter事件

处理拖动(来自 DragOver 事件)时是不是可以更改鼠标光标? [复制]

ListView 的 DragEnter、DragOver、DragDrop 事件未引发 (AllowDrop=True)

如何在 dragover/dragenter HTML 5 拖放期间更改图标

jQuery dragenter 或 dragover 包含子项