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

Javascript 如何在事件Dragover或Dragenter中从DataTransfer.getData获取数据,javascript,jquery,angularjs,jquery-ui,angular-ui,Javascript,Jquery,Angularjs,Jquery Ui,Angular Ui,我有一个密码: element.addEventListener('dragstart',function(e){ e.dataTransfer.setData('Text', 'something is here'); },false); 当我从DataTransfer.getdata获取数据时,事件删除正在运行。 但当我想在事件dragover或dragenter中获取数据时,数据为空 element.addEventListener('dragover',function(e){

我有一个密码:

element.addEventListener('dragstart',function(e){
   e.dataTransfer.setData('Text', 'something is here');
},false);
当我从DataTransfer.getdata获取数据时,事件删除正在运行。 但当我想在事件dragover或dragenter中获取数据时,数据为空

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

因此,如何在事件dragover或dragenter中获取数据通常除了
dragstart
drop
之外,您无法访问此事件信息。Firefox似乎为您提供了访问权限,但它似乎与标准背道而驰

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

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

读/写模式

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

只读模式

对于丢弃事件。可以创建表示拖动数据的项列表 读取,包括数据。无法添加新数据

保护模式

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

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


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

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