【问题标题】:HTML 5 drag events: 'dragleave' fired after 'dragenter'HTML 5 拖动事件:在“dragenter”之后触发“dragleave”
【发布时间】:2017-04-07 09:59:02
【问题描述】:

我在单页应用程序中使用 html5 拖动事件。

目前,我正在收听dragleavedragenter 事件以在元素上设置正确的类。

但是,当两个有效的目标元素(A 和 B)彼此相邻时,我们将一个元素通过 A 拖到 B 中,事件按以下顺序触发。

                     +--------------+-------------+
                     |              |             |
+-------+            |     A        |     B       |
|       |            |              |             |
| Elem  +------------------------------------>    |
|       |            |              |             |
+-------+            |              |             |
                     +--------------+-------------+
  1. dragenter的阿
  2. B的dragenter
  3. dragleave的阿

事件的预期顺序是,

  1. dragenter
  2. dragleave的阿
  3. B的dragenter

我假设这将是订单,因为在进入 B 之前,该项目必须离开 A。我在这里错过了什么吗?在dragleave 之前解雇dragenter 是否有理由?有没有办法改变这种行为?

我有一个 JSFiddle here

代码本身非常简单,只需监听 dragenterdragover

dragenter: function(e) {
    console.log("basket dragenter");
    // logic here
},
dragleave: function(e) {
    console.log("basket dragleave");
    // logic here
},

【问题讨论】:

    标签: javascript html drag-and-drop


    【解决方案1】:

    聚会有点晚了,但这是我的用例。假设 B 完全包含在 A 中:

                 +---------------------------+
                 |  A                        |
                 |      +---------------+    |
    +-----+      |      | B             |    |
    |     |      |      |               |    |
    |    -|------|------|--->           |    |
    +-----+      |      |               |    |
                 |      |               |    |
                 |      +---------------+    |
                 +---------------------------+
    

    您可以将 A 完全留在此处,也可以将其留给 B。B.dragleave 在 A.dragleave 之前触发 B.dragleave 的事实使您可以了解 A.dragleave 中的拖动方向处理程序。

    事实上,我只是意识到您的用例也是如此:您可以将 A 留在空白处(左上-下)或转到 B(右)。

    请注意,以上是我对“为什么”有用的解释。规范的这一部分确认了行为本身:

    https://www.w3.org/TR/html51/editing.html#drag-and-drop-processing-model

    【讨论】:

    • 感谢您的解释。但是,如果我们将框稍微分开,并以足够快的速度拖动项目,“dragEnter”仍会在“dragLeave”之前触发。不确定这是否是浏览器问题,但可以在 Chrome 中重新创建:jsfiddle.net/po8Ls9z2
    • 嗯,有趣的一点。我想你必须解决它,因为我不认为这是不正确的行为。我认为规范的这一部分是相关的:“如果用户代理在下一次迭代到期时仍在执行序列的上一次迭代(如果有的话),则中止本次迭代的这些步骤(有效地“跳过丢失的帧”)拖放操作)。"
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2012-12-21
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2020-06-19
    • 2019-06-02
    相关资源
    最近更新 更多