除非处理拖动,否则 HTML5 放置事件不起作用

IT技术 javascript html google-chrome drag-and-drop dom-events
2021-02-24 19:24:59

我正在收听该drop事件并正在执行e.preventDefault()但它试图打开丢弃的文件。直到昨天它都运行良好。但就在今天,它因某种未知原因而破裂。我做了一个JsFiddle#bwquR/10来反映相同。

编辑:

看起来如果你不采取dragover事件drop就无法处理。即使在小提琴中,如果您发表评论,dragover它将行不通。
在实际工作中,我错过了拼写dragover但它仍然是一个问题,drop没有dragover

小提琴实际上正在工作,但身体太小了(DROP那里只有文字)。它只dropDROP文本不在整个身体上的那个小区域发生事件所以我认为它不起作用。对困惑感到抱歉。

4个回答

我猜是因为没有dragOver事件处理程序,使用dragOver事件的默认事件处理程序,因此之后不会触发drop事件。e.preventDefault在放置事件之前需要使用dragOver 事件。

哦,天哪,这真是一个糟糕的系统设计。谢谢(你的)信息!
2021-05-02 19:24:59
@cronoklee 4 年后,我仍然这么说。糟糕的棘手设计
2021-05-09 19:24:59

https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Drag_operations

如果要允许删除,则必须通过取消事件来阻止默认处理。您可以通过从属性定义的事件侦听器返回 false 或调用事件的 event.preventDefault 方法来执行此操作。在单独脚本中定义的函数中,后者可能更可行。

<div ondragover="return false">
<div ondragover="event.preventDefault()">

在 dragenter 和 dragover 事件期间调用 preventDefault 方法将指示在该位置允许放置。但是,您通常希望仅在某些情况下调用 preventDefault 方法,例如,仅当链接被拖动时。为此,请调用一个函数,该函数检查条件并仅在满足条件时取消事件。如果不满足条件,则不要取消该事件,如果用户释放鼠标按钮,则不会发生放置。

https://developer.mozilla.org/en-US/docs/Web/Events/dragover

  /* events fired on the drop targets */
  document.addEventListener("dragover", function( event ) {
      // prevent default to allow drop
      event.preventDefault();
  }, false);
谢谢这么详细的回答。还有一段你没有引用,但恕我直言对于解释原因非常重要:“dragenter 和dragover 事件的侦听器用于指示有效的放置目标,即可以放置拖动项目的位置。大多数网页或应用程序的区域不是放置数据的有效位置。因此,这些事件的默认处理是不允许放置。
2021-05-05 19:24:59

我不确定我是否正确理解了您的问题,但是如果您想读取拖放的文件,则需要处理拖动事件并至少放置以下代码行:

evt.dataTransfer.dropEffect = 'copy';

否则 dropEffect 默认为 null,您将不会获得任何数据。

那是阻止我参加drop()活动的罪魁祸首除非我在放置区域上放置文件时必须使用evt.originalEvent.dataTransfer.dropEffect = "copy";以防止Uncaught TypeError: Cannot set property 'dropEffect' of undefined
2021-04-22 19:24:59
@iiminov 您必须这样做,因为您使用的是 jQuery。jQuery 创建一个自定义事件对象并将原始事件对象保留在originalEvent属性下。
2021-04-26 19:24:59

对我来说很好用。您是将其作为 HTTP 还是 FILE URL 加载?我相信它需要是 Chrome 的 HTTP URL。

JsFiddle 在 Chrome 中按我的预期工作。一旦文件超过 DROP,我就会收到 DragOver 消息。当我评论该警报时,我可以删除它并获取已删除的消息。
2021-04-24 19:24:59
作为 HTTP 本地主机。直到昨天它都运行良好。我无法理解发生了什么。
2021-04-29 19:24:59
它也对我有用。但是在DROP写的地方。不是在整个身体。所以我认为它不起作用。对不起。但是我已经编辑了我的问题。对不起
2021-05-08 19:24:59