#javascript #html
#javascript #HTML
Вопрос:
У меня есть синее и красное поле. Я хотел бы перетащить их, чтобы их можно было переключать. На данный момент я могу перетащить левое поле и поместить его в правое поле. Это работает нормально, но я не могу перетащить правое поле и поместить его в левое поле.
// Drag and the drop the items
const elements = document.querySelectorAll('#title-drag, #storename-drag');
for (let element of elements) {
// Allow the drop
element.addEventListener("dragover", function(event) {
event.preventDefault();
}, false);
element.addEventListener("dragstart", function(event) {
event.dataTransfer.setData("text", event.target.id);
}, false);
element.addEventListener('drop', function(event) {
let data = event.dataTransfer.getData("text");
console.log(event.target.className);
event.preventDefault();
element.appendChild(document.getElementById(data));
});
}
#title {
background: red;
}
#storename {
background: blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/js/all.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">
<!-- Title -->
<div class="row">
<div id="title-drag">
<div class="col-md-3" draggable="true" id="title">
<div class="mg-item-inner">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="bottom" data-container='body' title='Gibt den Seitentitel aus'>
<span class="name">TITLE</span><i class="fas fa-arrows-alt"></i></button>
<button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="bottom" data-container='body' title="Linie Erweitern / Reduzieren">
<i class="fas fa-swatchbook"></i></button>
</div><!-- /btn-group -->
<div class="input-group" role="group">
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">prefix <i class="fas fa-sort"></i></button>
<ul class="dropdown-menu">
<li><a href="#">prefix</a></li>
<li><a href="#">suffix</a></li>
<li><a href="#">none</a></li>
</ul>
</div><!-- /input-btn-group -->
<input type="text" class="form-control">
</div><!-- /input-group --><span type="button" class="btn add"><i class="fas fa-plus-circle"></i></span>
</div><!-- /mg-item-inner -->
</div><!-- /mg-item -->
</div>
<!--STORE NANE -->
<div id="storename-drag">
<div class="col-md-3" draggable="true" id="storename">
<div class="mg-item-inner">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="bottom" data-container='body' title='Fügt den Storename hinzu'>
<span class="name">STORENAME</span><i class="fas fa-arrows-alt"></i></button>
<button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="bottom" title="Linie Erweitern / Reduzieren">
<i class="fas fa-swatchbook"></i></button>
</div><!-- /btn-group -->
<div class="input-group" role="group">
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">prefix <i class="fas fa-sort"></i></button>
<ul class="dropdown-menu">
<li><a href="#">prefix</a></li>
<li><a href="#">suffix</a></li>
<li><a href="#">none</a></li>
</ul>
</div><!-- /input-btn-group -->
<input type="text" class="form-control">
</div><!-- /input-group --><span type="button" class="btn add"><i class="fas fa-plus-circle"></i></span>
</div><!-- /mg-item-inner -->
</div><!-- /mg-item -->
</div>
</div>
</div>
https://jsfiddle.net/Lb8e0pz3/
Почему я могу удалить левое поле, но не правое?
Комментарии:
1. Я думаю, это потому, что вы добавляете его к своему первому элементу.
let data = event.dataTransfer.getData("text"); element.appendChild(document.getElementById(data));
Попробуйте добавить его либо к вашему родительскому элементу, либо вычислить индекс элемента, прежде чем вы захотите добавить его туда.2. @nabais спасибо за эту информацию! Вероятно, это не сам родительский элемент, поскольку он также может быть родительским родительским элементом, и это должно быть либо
#title-drag
, либо#storename-drag
. Есть идеи о том, как я мог бы создать это утверждение?
Ответ №1:
Это просто потому, что вы делаете
element.appendChild(document.getElementById(data));
которые всегда добавляют элемент в качестве последних дочерних элементов… Таким образом, перемещаемый элемент всегда будет последним — вот почему, если вы переместите второй элемент, он все равно будет отображаться как второй. С точки зрения чистого кода все работает.
Комментарии:
1. О, я понимаю. Итак, как я могу исправить эту проблему?
Ответ №2:
вы могли бы увидеть, является ли цель первым элементом родительского элемента, и если да, добавьте:
if (isFirstElement(event.target)) { // implement function
element.parentNode.prepend(document.getElementById(data '-drag'));
} else {
element.parentNode.appendChild(document.getElementById(data '-drag'));
}
Комментарии:
1. Я пробовал это так: jsfiddle.net/ep5q4khd … но, как вы видите, у меня это не работает.