【问题标题】:why not use mouseup event target rather than position for "old school" drag-n-drop?为什么不使用 mouseup 事件目标而不是“老派”拖放的位置?
【发布时间】:2011-07-18 16:24:55
【问题描述】:

因此,从我所见,几乎所有与 IE 兼容的拖放操作都使用定位来确定拖放的位置。做mousedown之类的,判断所有droppable的位置,mouseup判断我们是否处于droppable的位置。为什么?我做了一个快速原型,它似乎可以工作,它使用 mouseup 上的 event.target (在 jquery 中,所以无论转换到其他地方)来确定放置元素。

是否有令人信服的理由不这样做? (在 mouseup 上使用 e.target)。因此,mousedown 确定要拖动的内容,而 mouseup 确定拖放的位置。添加一些变量以确保我们正在拖动,并记住拖动的内容。

【问题讨论】:

    标签: javascript internet-explorer drag-and-drop


    【解决方案1】:

    我的猜测:因为 mouseup 上的e.target 可以引用您正在拖动的元素(或其拖动幽灵)。如果您拖动一个元素,并且它(或半透明的幻影元素)像在桌面上拖动文件一样跟随您的光标,那么您的鼠标将始终在您拖动的元素上鼠标向上。


    或者,如果没有光标跟随,也没有重影,e.target 可能指的是“dropzone 元素”中的一个元素,而不是 dropzone 本身。

    例如:

    <div id="dropzone_element">
        <div id="previously_dropped_element" />
    <div>
    
    <div id="draggable_element" />
    

    因此,如果您将可拖动元素拖到 dropzone 元素上并释放鼠标,您实际上是在 dropzone 内先前放置的元素上释放了鼠标;而不是 dropzone 本身。

    在这两种情况下,检查鼠标位置是获得正确放置区元素的唯一方法。

    这些是我的猜测,但我没有 IE 来检查实际行为。


    编辑:在第一种情况下,位置检查是唯一的方法。在第二种情况下,您还可以检查目标的祖先以找到 dropzone 元素,正如 cmets 中的 aephus 所指出的那样。也就是说,如果之前放置的元素实际上已插入到放置区域的层次结构中,而不仅仅是被定位为看起来像它的样子——尽管这样做真的很奇怪:)

    【讨论】:

    • 第二种情况没有意义,您可以随时检查 e.target 的父级以检测它是否是放置区。即使您允许放置区域内的放置区域(通常不是这种情况),您仍然可以检测到最近的放置区域元素。
    • 如果没有更好的答案,我将在明天奖励您的第一个答案。这是一个可行的理由,但我想要更多反馈。
    • @aephus: 是的,在这种情况下,您可能是target 的祖先。但是对于 x 个嵌套元素,您必须递归地执行此操作,因此在我看来,仅检查鼠标位置并完成它仍然会更干净。但是对于拖动,你确实需要被拖动的视觉反馈,所以我的钱是在我的第一个解释上。第二个案例只是我头脑风暴一下:)
    • @aephus:听起来不错——我也很想看看其他人的想法。如前所述,我的假设只是理论并且在 IE 中未经测试,所以谁知道... :)
    • 在相对静态的页面中依赖位置可能会更好,但是当您在鼠标悬停和其他各种移动时显示内容时,重新计算位置会非常痛苦。
    【解决方案2】:

    第一个问题:拖动元素总是有滞后,尤其是在 IE 中。并且鼠标指针可以超过或落后于拖动元素。所以在放置时,指针实际上并没有在拖动元素上,并且 - 对于小的放置区域 - 不在放置区域上。 Ajax 库必须考虑到这一事实。使其工作可预测的唯一方法是比较拖动目标和放置区域的坐标。

    第二个问题:ajax 库可能会给你一个使用drop handler 的机会。 drop handler 是一个元素,它不是 dropzone 的子元素,但它覆盖了 dropzone。在这种情况下,无法通过 dropzone 捕获事件。但是比较坐标仍然有效。为什么有人会覆盖dropzone?让我们假设一个人有桌子。其中一个单元格是dropzone。现在想要捕捉鼠标滚轮事件。一个人创建与 table 大小相同的 div (#scroller) 并将其放在 table 上。然后他将另一个 div (#eventgrabber) 放入滚动条中。 Eventgrabber 比滚动条更高。现在可以在滚动条上捕获滚动事件。但为了能够拖动单元格,必须将 eventgrabber 指定为拖放处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多