Я пытаюсь создать простой веб-сайт, похожий на канбан (трэлло), для изучения javascript. Я получил работоспособность перетаскивания, но я пытаюсь добавить новую карту и переместить несколько карт в разные места в разных списках.
Первая карта (которая реализована в HTML с нуля, а не добавлена DOM), работает нормально. Я могу переместить эту карту куда угодно.
У меня две проблемы с моим кодом:
- Я создал две функции с именами
addCard()
и addTaskContainer()
, чтобы иметь возможность добавлять новые задачи. Элемент создается, но всякий раз, когда я пытаюсь переместить эту карту, первая, оригинальная карта перемещается в выброшенную позицию, а не DOM, создавшую ее.
- Если я пытаюсь добавить несколько карт с помощью функции
addCard()
, кажется, что они просто складываются в один и тот же div. Я понимаю, что мне нужно удалить начальный добавленный идентификатор, но я изо всех сил пытаюсь это сделать, хотя могу добавить новый идентификатор, если кнопка будет нажата снова.
Я хочу, чтобы в списках, содержащих разные карточки, всегда был доступен +1 контейнер задач для вновь добавленной карточки.
Я попытался установить addTaskContainer()
id = "";
в функции addCard()
, но не смог добавить его обратно к addTaskContainer()
при нажатии кнопки.
Я также пробовал проходить по карточкам в карточках, например:
for (const card in cards) {
card.addEventListener('dragstart', dragStart);
card.addEventListener('dragend', dragEnd);
}
и карточная карточка вот так:
for (const card of cards) {
card.addEventListener('dragstart', dragStart);
card.addEventListener('dragend', dragEnd);
}
без удачи.
HTML
<div class="lists">
<div class="list">
<div class="list-header">
<p>Backlog</p>
</div>
<div class="list-body" id="backlog">
<p>body</p>
<div class="taskContainer">
<div class="card" draggable="true"> </div>
</div>
<div class="taskContainer">
<div class="card" draggable="true"> </div>
</div>
<div class="taskContainer">
</div>
</div>
<div class="list-footer">
<p>footer</p>
<button onclick="addCard()">Add ned card</button>
</div>
</div>
</div>
javscript
const card = document.querySelector('.card');
const cards = document.querySelectorAll('.card')
const taskContainers = document.querySelectorAll('.taskContainer');
// card listeners
card.addEventListener('dragstart', dragStart);
card.addEventListener('dragend', dragEnd);
// Loop through taskContainer boxes and add listeners
for (const taskContainer of taskContainers) {
taskContainer.addEventListener('dragover', dragOver);
taskContainer.addEventListener('dragenter', dragEnter);
taskContainer.addEventListener('dragleave', dragLeave);
taskContainer.addEventListener('drop', dragDrop);
}
// Drag Functions
function dragStart() {
this.className += ' hold';
setTimeout(() => (this.className = 'invisible'), 0); //set timeout so card wont dissapear
}
function dragEnd() {
this.className = 'card';
}
function dragOver(e) {
e.preventDefault();
}
function dragEnter(e) {
e.preventDefault();
this.className += ' hover';
}
function dragLeave() {
this.className = 'taskContainer';
}
function dragDrop() {
this.className = 'taskContainer';
this.append(card);
}
//add card function
function addTaskContainer() {
var taskContainer = document.createElement('div');
taskContainer.className = "taskContainer";
taskContainer.id = "add-new-card";
document.getElementById("backlog").append(taskContainer);
}
function addCard() {
addTaskContainer();
var card = document.createElement('div');
card.className = "card";
card.id = "new-card";
document.getElementById("add-new-card").appendChild(card);
document.getElementById("new-card").setAttribute('draggable', true);
}