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

nắn*_*huế 12 javascript jquery jquery-ui angularjs angular-ui

我有一个代码:

element.addEventListener('dragstart',function(e){
   e.dataTransfer.setData('Text', 'something is here');
},false);
Run Code Online (Sandbox Code Playgroud)

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

element.addEventListener('dragover',function(e){
   var a = e.dataTransfer.getData('Text');
   console.log(a);
},false);
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*ire 14

通常,您无法访问除dragstart和之外的事件的此信息drop.Firefox似乎为您提供访问权限,但它似乎违反了标准.

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

拖动数据存储模式,它是以下之一:

读/写模式

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

只读模式

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

保护模式

对于所有其他活动.可以枚举拖动数据存储表示拖动数据的项目列表中的格式和种类,但数据本身不可用,并且不能添加新数据.

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

因此,在dragover上,数据存储处于保护模式,因此数据不可用.同样,Firefox以不同的方式实现了这一点,但在任何情况下都不应该依赖它.

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

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