嗨,我试图创建一个表单生成器,我通过创建元素,将它们放入一个列表组,然后使它们可拖动来实现这一点。这工作到目前为止,但当我拖动项目并将其放置在它从元素部分消失时,这是有意义的,但我希望它找到已选定的项目的ID,然后复制元素,但使用不同的ID。
这是我目前为止编写的代码JavaScript
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
console.log("Component Selected")
var elem = document.querySelector(ev.target.id);
var clone = elem.cloneNode(true);
clone.id = ('drag9');
elem.after(clone);
}
<div class="row">
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
<ul class="list-group">
<li draggable="true" ondragstart="drag(event)" id="drag1" class="list-group-item">
<label for="exampleFormControlInput1" class="form-label">Input</label>
<button type="button" class="fa-solid fa-pen-to-square fa-lg"></button>
<input type="email" class="form-control" id="ControlInput1" placeholder="">
</li>
</ul>
</div>
</div>
1条答案
按热度按时间tsm1rwdh1#
这种类型的动态页面创建功能必须在没有
id
属性的情况下完成,它们很容易出错,而且维护起来非常困难。拖放功能由多个事件组成。您不应该在
dragstart
上执行所有操作,拖放有其自己的事件drop
,在此期间,您应该将元素附加到目标元素。并且,永远不要对元素使用内联侦听器。在这种情况下,将delegatedragstart
事件添加到ul
容器是有用的。当你拖动一个元素时,它应该只放在一个元素上,这个元素是要放的元素的允许的父元素(
li
元素的唯一允许的父元素是menu
、ul
和ol
,它不应该放在div
上)。由于拖放API没有提供一个属性来存储对实际拖动的元素的实时引用,因此最好在
dragstart
事件触发时将其存储在一个变量中。这可以解决id
属性和所有不必要的DOM遍历的需要。考虑到这一切,我创建了一个完全
id
的示例代码,说明如何实现简单的拖放操作,您可以根据需要进一步开发它。