【问题标题】:drag drop doesn't work for dynamically inserted element拖放不适用于动态插入的元素
【发布时间】:2022-01-25 10:19:20
【问题描述】:

我有一个div,它是一个可拖动部分的列表。

然后我有一个如下所示的拖放脚本:

const tasks = document.querySelectorAll('.task');

tasks.forEach(task => {

  task.addEventListener('dragstart', dragStart, false);
  task.addEventListener('dragenter', dragEnter, false);
  task.addEventListener('dragleave', dragLeave, false);
  task.addEventListener('dragover', dragOver, false);
  task.addEventListener('drop', dragDrop, false);
  task.addEventListener('dragend', dragEnd, false);

});



function dragStart(e) {
  //do something
};

function dragEnter(e) {
  //do something
}

function dragLeave(e) {
  //do somehting
}

function dragOver(e) {

  //do something
}

function dragDrop(e) {
  //do something 
}

function dragEnd(e) {

  //do something
}
<div id="list">
  <section id="1" class="task" draggable="true">
    <p> Something here </p>
  </section>

  <section id="2" class="task" draggable="true">
    <p> Something here </p>
  </section>

  ...

</div>

一切都很完美(每个部分都可以拖放)。

然而,如果我没有使用静态 HTML:document.getElementById('list').insertHTML(//my draggable sections),那么我的 js 脚本似乎不再工作了。我无法拖放我的部分。

我不明白为什么,似乎插入这些部分会动态改变一些东西,但我不明白是什么......有没有办法解决这个问题?

【问题讨论】:

  • 您能否展示您用于动态添加元素的代码,以便我们帮助调试?

标签: javascript html jquery css


【解决方案1】:

element.insertHTML() 你是element.insertAdjacentHTML()吗?
无论如何,我猜代码执行顺序有问题,它可能正在运行

const tasks = document.querySelectorAll('.task');

在您更改 .list 元素内的 html 之前。这意味着const tasks 最终是空数组(它实际上是空的 NodeList,但在这里没有变化)

另外,如果您没有任何特定理由使用insertAdjacentHTML,我建议您改用appendChild

UPD

此外,每次您将新项目添加到列表时,您都必须将 eventListeners 添加到您添加的每个节点。

【讨论】:

  • 非常感谢您的回答。抱歉,我实际上使用的是 innerHTML,但似乎即使我计算任务后它仍然无法工作,我不明白为什么?
  • 可能是innerHTML删除事件idk
  • @Question1010 如果您没有任何基本的人为错误或误用,innerHTML 只会更改值并且不会将节点(元素到 DOM)呈现。如果您不想在 google 上了解更多查找“js 事件循环”,这将是一个更高级的主题。但正如我在最初的回答中所说,如果您不想向节点添加事件侦听器,最好使用appendChild()。另一个提示是在添加事件侦听器之前发送console.log(tasks),以便在添加事件侦听器时知道您的 DOM 中是否有任何节点 .task
  • 感谢您的详细回答,这很有趣!我要查找js事件循环:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2015-01-29
相关资源
最近更新 更多