Javascript拖放:成功拖放后删除拖动的元素

Posted

技术标签:

【中文标题】Javascript拖放:成功拖放后删除拖动的元素【英文标题】:Javascript Drag and Drop: removing dragged element following successful drop 【发布时间】:2012-01-06 08:29:37 【问题描述】:

我在 javascript 中使用原生 拖放 API。成功放置后如何从 DOM 中删除拖动的元素?

我尝试过监听 drop 事件,但这只会在被拖放到的元素上触发,并且不会引用被拖动的元素。 我已尝试收听 dragend 元素,但这并不能让我知道投放是否成功。 我试图避免将被拖动的元素存储在全局变量中,因为如果在不同的选项卡或浏览器之间发生拖动,这会导致问题。

这是一个例子:http://jsfiddle.net/KNG6n/3/

可以拖入框中的字母列表。当一个字母的节点被放到盒子上时,我希望它从列表中删除(不影响包含相同字母的任何其他列表项)

【问题讨论】:

【参考方案1】:

在对拖动的元素进行任何操作之前,侦听 dragend 事件并检查 dataTransfer 对象的 dropEffect 变量:

htmlElement.addEventListener('dragend', function(event)
    if(event.dataTransfer.dropEffect !== 'none')
        $(this).remove();
    
);

【讨论】:

显然 dropEffect 在 Windows 上的 Chrome 中将永远没有,错误报告已开放多年:code.google.com/p/chromium/issues/detail?id=39399【参考方案2】:

也看看这个例子:http://html5demos.com/drag

var el = document.getElementById(e.dataTransfer.getData('Text'));

el.parentNode.removeChild(el);

【讨论】:

此解决方案仅在所有元素都有 id 时才有效(我的没有)。此外,这意味着您必须将数据设置为 id,而不是有用的东西。【参考方案3】:

一种方法是将其分配给范围在 dragstart 之外的变量,并在拖放时使用该元素。

See this fiddle.

【讨论】:

我试图避免将被拖动的元素存储在全局变量中,因为如果在不同的选项卡或浏览器之间发生拖动,这将导致问题。【参考方案4】:

你在dragend事件中得到元素的放置位置。您可以查看该位置是否存在可放置元素。

您可以使用document.elementFromPoint(x, y);

【讨论】:

以上是关于Javascript拖放:成功拖放后删除拖动的元素的主要内容,如果未能解决你的问题,请参考以下文章

拖放后向可拖放项目添加标签

使用jquery ui拖放后的动态div宽度

css / html5:拖放后悬停状态保持不变

删除拖放时可拖动的助手克隆

使用纯javascript拖放并再次拖动

拖放后无法访问元素