【问题标题】:Why does HTML5 Drag n Drop target child? (Sortable List)为什么 HTML5 拖放目标是孩子? (排序列表)
【发布时间】:2015-04-10 05:23:01
【问题描述】:

当我尝试使用 HTML5 Drag n Drop 创建可排序列表时,放置事件的目标 (e.target) 是放置区域元素的子元素,而不是放置区域元素本身。这是不好的。

我希望以下代码中e.target 的值是包含ondrop="drop(event)"div,而不是<p> 子级。

链接到JSFiddle 完整示例。

function drop(e) {
    e.preventDefault();
    var data = e.dataTransfer.getData("text");
    e.target.appendChild(document.getElementById(data));   
}

发生这种情况是因为事件冒泡还是类似的原因?可以帮助我创建 Drag n Drop 可排序列表的最佳解决方法是什么?

编辑:我希望了解原生 HTML5 和 Javascript,而不是使用 jQuery 库之类的。

【问题讨论】:

  • 我猜this answer 确实对这个问题做了一些解释
  • 您的链接帮助我理解了这个问题。以下是链接中的引述:“因为 dragenter 事件在父节点上的 dragleave 事件之前在子节点上触发”。

标签: javascript html drag-and-drop draggable


【解决方案1】:

您正在尝试附加到目标元素,因此您遇到了问题。

你应该尝试在目标元素之前插入元素。

function drop(e) {
    e.preventDefault();

    var data = e.dataTransfer.getData("text");
    var list = document.getElementById("list");
    list.insertBefore(document.getElementById(data), e.target.parentNode);
}

这是更新后的fiddle

【讨论】:

  • 您的回答解决了我的问题,但为什么只有父 <div> 具有放置区代码时,<p> 标记被视为放置区? (ondragover="allowDrop(event)")
  • 另外,这是 HTLM5 拖放标准的正确实现吗?或者它在某种程度上是 hacky 和不正确的?
  • 一个。在您阅读 Quirksmode 的关于 HTML5 拖放的post 之后,您对触摸它完全保持警惕。湾。 e.target 仍然是子节点——我们只是在处理那个 c。其他所有关于可排序 HTML5 拖放列表的帖子都包含大约 10 倍以上的代码,这让我很担心。你有什么想法?
  • 它可以正常工作,但是您在 jsfiddle 示例中包含了 jquery,而它没有被使用。误导初学者!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2012-06-19
  • 2023-03-19
相关资源
最近更新 更多