Javascript HTML5删除事件不';除非处理好dragover,否则无法工作
我正在收听Javascript HTML5删除事件不';除非处理好dragover,否则无法工作,javascript,html,google-chrome,drag-and-drop,dom-events,Javascript,Html,Google Chrome,Drag And Drop,Dom Events,我正在收听drop事件并执行e.preventDefault()操作,但它正在尝试打开被删除的文件。直到昨天,天气一直很好。但就在今天,它因为某种未知的原因破裂了。我做了一个调查来反映同样的情况 编辑: 如果不执行dragover事件,则无法处理drop。即使在小提琴中,如果您对dragover进行注释,它也不会起作用。 在实际工作中,我错过了dragover的拼写,但这仍然是一个问题drop如果没有dragover 小提琴实际上是在工作,但它的身体太小了(只有文本DROP在那里)。它只在dro
drop
事件并执行e.preventDefault()
操作,但它正在尝试打开被删除的文件。直到昨天,天气一直很好。但就在今天,它因为某种未知的原因破裂了。我做了一个调查来反映同样的情况
编辑:
如果不执行dragover
事件,则无法处理drop
。即使在小提琴中,如果您对dragover
进行注释,它也不会起作用。在实际工作中,我错过了
dragover
的拼写,但这仍然是一个问题drop
如果没有dragover
小提琴实际上是在工作,但它的身体太小了(只有文本
DROP
在那里)。它只在drop
文本不在全身的那一小块区域上进行drop
事件。所以我认为它不起作用。很抱歉给您添麻烦。对我来说很好。您是将其作为HTTP还是文件URL加载?我相信它需要是一个带有Chrome的HTTP URL。我猜这是因为没有dragOver事件处理程序,使用了dragOver事件的默认事件处理程序,因此,之后不会触发drop事件。在dragOver事件之前,需要使用e.prevent default
处理dragOver事件。我不确定是否正确理解了您的问题,但如果您想读取已删除的文件,则需要处理dragOver事件,并至少在其中放置以下代码行:
evt.dataTransfer.dropEffect = 'copy';
否则,dropEffect默认为空,您将无法获得任何数据。
如果要允许删除,必须通过取消事件来防止默认处理。您可以通过从属性定义的事件侦听器返回false或调用事件的event.preventDefault方法来完成此操作。后者在单独脚本中定义的函数中可能更可行
<div ondragover="return false">
<div ondragover="event.preventDefault()">
作为HTTP本地主机。直到昨天,天气一直很好。我不明白发生了什么。JSFIDLE在Chrome中的工作与我预期的一样。文件一放完我就收到了DragOver的信息。当我评论这个警告时,我可以删除它并得到删除的消息。这对我来说也很有用。但是在写
DROP
的区域。不是在整个身体里。所以我认为它不起作用。很抱歉不过,我编辑了我的问题。对不起,刚才有这个问题,你的问题帮我解决了。我在dragover事件中返回false,drop开始工作。。谢谢有时,定义一点cssbody{width:300px;height:300px;border:1px solid 35; f1f1f1;}
会有所帮助,这样您就可以实际查看拖放区域的大小。顺便说一句,这是阻止我进入drop()
事件的罪魁祸首。除了我必须使用evt.originalEvent.dataTransfer.dropEffect=“copy”
防止未捕获类型错误:当我在放置区域上保存文件时,无法设置未定义的属性“dropEffect”。@iiminov您必须这样做,因为您使用的是jQuery。jQuery创建了一个自定义事件对象,并将原始对象保留在originalEvent
属性下。谢谢你的信息@4年后的克罗诺克利,我仍然这么说。糟糕的设计谢谢你的详细回答。还有一段您没有引用,但IMHO非常重要,可以解释原因:“dragenter和dragover事件的侦听器用于指示有效的放置目标,即可以放置拖动项目的位置。网页或应用程序的大多数区域都不是放置数据的有效位置。因此,这些事件的默认处理方式是不允许删除。”
/* events fired on the drop targets */
document.addEventListener("dragover", function( event ) {
// prevent default to allow drop
event.preventDefault();
}, false);