Todolist 中的 Sortable.js

问题描述

我是 JavaScript 初学者。我按照教程创建了一个 todolist。 现在我想通过 todolist 项目对 div 进行排序。拖放。

我用 js 库 sortable.js 尝试过它,但我现在不知道为什么它不起作用。我不能拖动 div。我相信这是一个简单的修复。但正如我所说,我对 js 很陌生,所以如果有人能告诉我这个问题,那就太好了。谢谢!

<html lang="en">
<head>
    <Meta charset="UTF-8">
    <Meta http-equiv="X-UA-Compatible" content="IE=edge">
    <Meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" />
    <link rel="stylesheet" href="./style.css">

    <title>Todo List</title>
</head>
<body>

    <header>
        <h1>Todo Liste</h1>
    </header>

    <form>
        <input type="text" class="todo-input">
        <button class="todo-button" type="submit">
            <i class="fas fa-plus-square"></i>
        </button>

        <div class="select">
            <select name="todos" class="filter-todo">
                <option value="all">Alle</option>
                <option value="completed">Erledigt</option>
                <option value="uncompleted">Nicht Erledigt</option>
            </select>
        </div>

    </form>

    <div class="todo-container">
        <ul id="todocontainer" class="todo-list"></ul>

    </div>



    <script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.10.2/Sortable.min.js"></script>
    <script>
Sortable.create(todocontainer,{ /* options */ });
    </script>

<script src="./app.js"></script>
    
</body>
</html>

还有我的 app.js:


const todoInput = document.querySelector('.todo-input');
const todobutton = document.querySelector('.todo-button');
const todoList = document.querySelector('.todo-list');
const filterOption = document.querySelector('.filter-todo');

//Event Listeners

document.addEventListener('DOMContentLoaded',getTodos);
todobutton.addEventListener('click',addTodo)
todoList.addEventListener('click',deleteCheck);
filterOption.addEventListener('click',filterTodo);

//Functions

function addTodo(event) {

    //Verhindere Submit / reload
    event.preventDefault();

    //Div generieren
    const todoDiv = document.createElement("div");
    todoDiv.classList.add("todo");

    //li generieren
    const newTodo = document.createElement('li');

    //Text einfügen
    newTodo.innerText = todoInput.value;

    //Style css einfügen
    newTodo.classList.add('todo-item');

    //li in Div rein
    todoDiv.appendChild(newTodo);

    //checkmark Button
    const completedButton = document.createElement('button');
    completedButton.innerHTML = '<i class="fas fa-check"></i>';
    completedButton.classList.add("complete-btn");
    todoDiv.appendChild(completedButton);

    //Trash Button
    const trashButton = document.createElement('button');
    trashButton.innerHTML = '<i class="fas fa-trash"></i>';
    trashButton.classList.add("trash-btn");
    todoDiv.appendChild(trashButton);

    //Todo speichern
    saveLocalTodos(todoInput.value);

    //Append to List
    todoList.appendChild(todoDiv);

    //Clear input value
    todoInput.value = "";
}


function deleteCheck(e) {
    const item = e.target;

    //Todo löschen
    if(item.classList[0] === "trash-btn") {

        //Hocharbeiten zu parent
        const todo = item.parentElement;
        todo.classList.add("fall");
        removeLocalTodos(todo);

        //Warte bis die Animation fertig ist
        todo.addEventListener('transitionend',function() {
            todo.remove();
        });
    }

    if(item.classList[0] === "complete-btn") {
        const todo = item.parentElement;
        todo.classList.toggle("completed");
    }
}

function filterTodo(e) {
    const todos = todoList.childNodes;
    todos.forEach(function(todo) {
        switch(e.target.value) {
            case "all":
                todo.style.display = "flex";
                break;

            case "completed":
                if(todo.classList.contains("completed")) {
                    todo.style.display = "flex";
                } else {
                    todo.style.display = "none";
                }
                break;

            case "uncompleted":
                if(!todo.classList.contains("completed")) {
                    todo.style.display = "flex";
                } else {
                    todo.style.display = "none";
                }
                break;
                }

    });   
}


function saveLocalTodos(todo) {

    //Check ob es schon Einträge gibt
    let todos;
    if(localStorage.getItem('todos') === null) {
        todos = [];
    } else {
        todos = JSON.parse(localStorage.getItem('todos'));
    }

    todos.push(todo);
    localStorage.setItem('todos',JSON.stringify(todos));
}


function getTodos() {

    let todos;
    if(localStorage.getItem('todos') === null) {
        todos = [];
    } else {
        todos = JSON.parse(localStorage.getItem('todos'));
    }

    todos.forEach(function(todo){


    //Div generieren
    const todoDiv = document.createElement("div");
    todoDiv.classList.add("todo");

    //li generieren
    const newTodo = document.createElement('li');

    //Text einfügen
    newTodo.innerText = todo;

    //Style css einfügen
    newTodo.classList.add('todo-item');

    //li in Div rein
    todoDiv.appendChild(newTodo);

    //checkmark Button
    const completedButton = document.createElement('button');
    completedButton.innerHTML = '<i class="fas fa-check"></i>';
    completedButton.classList.add("complete-btn");
    todoDiv.appendChild(completedButton);

    //Trash Button
    const trashButton = document.createElement('button');
    trashButton.innerHTML = '<i class="fas fa-trash"></i>';
    trashButton.classList.add("trash-btn");
    todoDiv.appendChild(trashButton);

    //Append to List
    todoList.appendChild(todoDiv);
        
    });

}


function removeLocalTodos(todo) {
  //Check ob es schon Einträge gibt
  let todos;
  if(localStorage.getItem('todos') === null) {
      todos = [];
  } else {
      todos = JSON.parse(localStorage.getItem('todos'));
  }

  //Finde den Index von dem Todo indem man das Child aufruft
  const todoIndex = todo.children[0].innerText;

  //Von wo willst du entfernen? Bis wo? -> 1
  todos.splice(todos.indexOf(todoIndex),1);

  localStorage.setItem("todos",JSON.stringify(todos));
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)