Javascript 为什么不使用mouseup事件目标而不是“位置”;“老派”;拖放?

Javascript 为什么不使用mouseup事件目标而不是“位置”;“老派”;拖放?,javascript,internet-explorer,drag-and-drop,Javascript,Internet Explorer,Drag And Drop,所以,从我所看到的几乎所有与IE兼容的drag-n-drop都使用定位来确定放置的位置。做一些像mousedown这样的操作,确定所有可拖放的位置,mouseup确定我们是否处于可拖放的位置。为什么?我制作了一个快速的原型,它似乎可以工作,它使用mouseup上的event.target(在jquery中,所以无论在其他地方转换成什么)来确定drop元素 有没有令人信服的理由不这样做?(使用鼠标上的e.target)。因此,mousedown决定拖动什么,mouseup决定将其拖放到哪里。添加一

所以,从我所看到的几乎所有与IE兼容的drag-n-drop都使用定位来确定放置的位置。做一些像mousedown这样的操作,确定所有可拖放的位置,mouseup确定我们是否处于可拖放的位置。为什么?我制作了一个快速的原型,它似乎可以工作,它使用mouseup上的event.target(在jquery中,所以无论在其他地方转换成什么)来确定drop元素


有没有令人信服的理由不这样做?(使用鼠标上的e.target)。因此,mousedown决定拖动什么,mouseup决定将其拖放到哪里。添加一些变量以确保我们正在拖动,并记住拖动的内容。

我的猜测:因为鼠标上的
e.target
可以引用您正在拖动的元素(或其拖动重影)。如果您拖动一个元素,并且它(或半透明的重影元素)像在桌面上拖动文件时一样跟随光标,则当您向上拖动鼠标时,鼠标将始终位于要拖动的元素上方


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

例如:

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

<div id="draggable_element" />

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

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

这可能是我的猜测,但我不必检查IE的实际行为



编辑:在第一种情况下,位置检查是唯一的方法。在第二种情况下,您还可以检查目标的祖先以找到dropzone元素,正如aephus在注释中指出的那样。如果,也就是说,先前删除的元素实际上已经插入到dropzone的层次结构中,而不仅仅是被定位成它的样子-尽管这样做会非常奇怪:)

第一个问题:拖动元素时总是有滞后,特别是在IE中,鼠标指针可能超出或落在拖动元素后面。所以在拖放时,指针实际上不在拖动元素上,对于较小的拖放区域,指针不在拖放区域上。Ajax库必须考虑这一事实。唯一的方法是比较拖拽目标和下降区域的坐标


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

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