【问题标题】:Removing all todos bring them back when I add当我添加时,删除所有待办事项会将它们带回来
【发布时间】:2020-12-24 10:47:27
【问题描述】:

我正在构建一个待办事项应用程序,一切都运行良好,直到我决定添加一个按钮以一键删除所有待办事项(ul)。当我单击删除按钮时,所有待办事项都会被删除,但是当我单击添加按钮时,它们都会立即返回。

const input = document.getElementById('input');
const addBtn = document.getElementById('btn');
const removeBtn = document.getElementById('removeBtn')
const todoList = document.getElementById('todoList');
var ulElement = document.createElement('ul');
let placeholderValue = '';


// This code is for clear placeholder value
input.addEventListener('focus' , () => {
    placeholderValue = input.placeholder;
    input.placeholder = '';
});

input.addEventListener('blur' , ()=> {
    input.placeholder = placeholderValue;
});
// this function is for add to do to a list
function addTodo(){

    let liElements = document.createElement('li');
    
    todoList.appendChild(ulElement);
    ulElement.appendChild(liElements);
    liElements.classList.add('liElement')
    liElements.innerHTML = input.value;
    
    // this code is for remove todo from the list

    liElements.addEventListener('contextmenu' , (e)=> {
        e.preventDefault();
        liElements.classList.add('done');
    });
    liElements.addEventListener('dblclick' , (e) => {
        e.preventDefault()
        liElements.remove()
    }); 
};
addBtn.addEventListener('click' , addTodo)



removeBtn.addEventListener('click' , () => {
    ulElement.remove()
});
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@1,600&display=swap');
*{
    margin: 0;
    box-sizing: border-box;  
    font-family: 'Playfair Display', serif;
}
body{
    background-color: #DC86A9;

}
.mainInput {
    display: flex;
    justify-content: center;
    margin-top: 15%;
    
}
.mainInput input + button {
    margin-left: 10px;
}
.mainInput input {
    width: 500px;
    height: 50px;
    border: none;
    border-radius: 50px;
    box-shadow: 4px 4px 60px  white;
    padding: 25px;
}
.mainInput input::placeholder{
    font-size: 22px;
    text-align: center;
}
.mainInput button {
    border-radius: 10px ;
    background-color: rgb(102, 102, 255);
    margin-left: 10px;
    border: none;
    border-radius: 550px;
    color: white;
    font-weight: 900;
    font-size: 32px;
    width: 80px;
    cursor: pointer;
    box-shadow: 4px 4px 30px  white;
}
.btn1 {
    font-size: 14px !important;
    background-color: rgb(252, 53, 53) !important;
    padding-left: 5px;
}
span {
    display: flex;
    justify-content: center;
    margin-top: 50px;
    font-size: 30px;
    color: white;
}
.todoList {
    display:flex;
    justify-content:center;
    margin-top : 2%;
}
.todoList ul {
    list-style-type: none;
    margin-right: 30px;
    color: white;
    font-size: 26px;
    font-weight: 500
}
.todoList ul li {
    cursor: pointer;
}

.done {
    color: rgb(190, 190, 190);
    text-decoration: line-through
}
.note {
    display: flex;
    justify-content: center;
    margin-top: 10px;
    font-size: 14px;
    color: white;
}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css">
    <title>TodoApp</title>
</head>
<body>
    <div class="mainInput">
        <input type="text" class="input" id="input" placeholder="Enter your todo : ">
        <button class="btn" id="btn">+</button><button class="btn btn1" id="removeBtn">RemoveAll</button>
    </div>
    
    <span> Todo list : </span>
    <div class="todoList" id="todoList"></div>

    <span class="note">Right click to make todo done</span>
    <span class="note">dbl click to remove todo</span>
    <script src="js/main.js"></script>
    <script src="https://kit.fontawesome.com/a81368914c.js"></script>
</body>
</html>

【问题讨论】:

  • 您正在从 DOM 中删除 uElement 但并未删除其子元素,因此当 ulElement 在 addTodo() 函数中重新附加到 DOM 时,它们自然会重新出现。
  • 哦!我现在明白了,谢谢

标签: javascript html css


【解决方案1】:

将您的删除逻辑更改为此以清空 &lt;ul&gt; 中的所有内容

removeBtn.addEventListener('click' , () => {
  ulElement.innerHTML = "";
});

【讨论】:

  • 谢谢
【解决方案2】:

您可以使用 remove the child 来删除所有子元素。

const input = document.getElementById('input');
const addBtn = document.getElementById('btn');
const removeBtn = document.getElementById('removeBtn')
const todoList = document.getElementById('todoList');
var ulElement = document.createElement('ul');
let placeholderValue = '';


// This code is for clear placeholder value
input.addEventListener('focus' , () => {
    placeholderValue = input.placeholder;
    input.placeholder = '';
});

input.addEventListener('blur' , ()=> {
    input.placeholder = placeholderValue;
});
// this function is for add to do to a list
function addTodo(){

    let liElements = document.createElement('li');
    
    todoList.appendChild(ulElement);
    ulElement.appendChild(liElements);
    liElements.classList.add('liElement')
    liElements.innerHTML = input.value;
    
    // this code is for remove todo from the list

    liElements.addEventListener('contextmenu' , (e)=> {
        e.preventDefault();
        liElements.classList.add('done');
    });
    liElements.addEventListener('dblclick' , (e) => {
        e.preventDefault()
        liElements.remove()
    }); 
};
addBtn.addEventListener('click' , addTodo)



removeBtn.addEventListener('click' , () => {
    while (ulElement.firstChild) ulElement.removeChild(ulElement.firstChild);
    ulElement.remove()
});
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@1,600&display=swap');
*{
    margin: 0;
    box-sizing: border-box;  
    font-family: 'Playfair Display', serif;
}
body{
    background-color: #DC86A9;

}
.mainInput {
    display: flex;
    justify-content: center;
    margin-top: 15%;
    
}
.mainInput input + button {
    margin-left: 10px;
}
.mainInput input {
    width: 500px;
    height: 50px;
    border: none;
    border-radius: 50px;
    box-shadow: 4px 4px 60px  white;
    padding: 25px;
}
.mainInput input::placeholder{
    font-size: 22px;
    text-align: center;
}
.mainInput button {
    border-radius: 10px ;
    background-color: rgb(102, 102, 255);
    margin-left: 10px;
    border: none;
    border-radius: 550px;
    color: white;
    font-weight: 900;
    font-size: 32px;
    width: 80px;
    cursor: pointer;
    box-shadow: 4px 4px 30px  white;
}
.btn1 {
    font-size: 14px !important;
    background-color: rgb(252, 53, 53) !important;
    padding-left: 5px;
}
span {
    display: flex;
    justify-content: center;
    margin-top: 50px;
    font-size: 30px;
    color: white;
}
.todoList {
    display:flex;
    justify-content:center;
    margin-top : 2%;
}
.todoList ul {
    list-style-type: none;
    margin-right: 30px;
    color: white;
    font-size: 26px;
    font-weight: 500
}
.todoList ul li {
    cursor: pointer;
}

.done {
    color: rgb(190, 190, 190);
    text-decoration: line-through
}
.note {
    display: flex;
    justify-content: center;
    margin-top: 10px;
    font-size: 14px;
    color: white;
}
    <div class="mainInput">
        <input type="text" class="input" id="input" placeholder="Enter your todo : ">
        <button class="btn" id="btn">+</button><button class="btn btn1" id="removeBtn">RemoveAll</button>
    </div>
    
    <span> Todo list : </span>
    <div class="todoList" id="todoList"></div>

    <span class="note">Right click to make todo done</span>
    <span class="note">dbl click to remove todo</span>
    <script src="https://kit.fontawesome.com/a81368914c.js"></script>

【讨论】:

  • 为什么循环。效率太低了
  • 有更好的方法吗?
【解决方案3】:

你需要简化。

这里有一个静态 UL,按钮清空它

const input = document.getElementById('input');
const addBtn = document.getElementById('btn');
const removeBtn = document.getElementById('removeBtn')
const todoList = document.getElementById('todoList');
let placeholderValue = '';


// This code is for clear placeholder value
input.addEventListener('focus', () => {
  placeholderValue = input.placeholder;
  input.placeholder = '';
});

input.addEventListener('blur', () => {
  input.placeholder = placeholderValue;
});
// this function is for add to do to a list
function addTodo() {
  let liElement = document.createElement('li');
  liElement.classList.add('liElement')
  liElement.innerHTML = input.value;
  todoList.appendChild(liElement);

  // this code is for remove todo from the list

  liElement.addEventListener('contextmenu', (e) => {
    e.preventDefault();
    liElement.classList.add('done');
  });
  liElement.addEventListener('dblclick', (e) => {
    e.preventDefault()
    liElement.remove()
  });
};
addBtn.addEventListener('click', addTodo)



removeBtn.addEventListener('click', () => {
  document.getElementById("todoList").innerHTML = "";
});
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@1,600&display=swap');
* {
  margin: 0;
  box-sizing: border-box;
  font-family: 'Playfair Display', serif;
}

body {
  background-color: #DC86A9;
}

.mainInput {
  display: flex;
  justify-content: center;
  margin-top: 15%;
}

.mainInput input+button {
  margin-left: 10px;
}

.mainInput input {
  width: 500px;
  height: 50px;
  border: none;
  border-radius: 50px;
  box-shadow: 4px 4px 60px white;
  padding: 25px;
}

.mainInput input::placeholder {
  font-size: 22px;
  text-align: center;
}

.mainInput button {
  border-radius: 10px;
  background-color: rgb(102, 102, 255);
  margin-left: 10px;
  border: none;
  border-radius: 550px;
  color: white;
  font-weight: 900;
  font-size: 32px;
  width: 80px;
  cursor: pointer;
  box-shadow: 4px 4px 30px white;
}

.btn1 {
  font-size: 14px !important;
  background-color: rgb(252, 53, 53) !important;
  padding-left: 5px;
}

span {
  display: flex;
  justify-content: center;
  margin-top: 50px;
  font-size: 30px;
  color: white;
}

.todoList {
  display: flex;
  justify-content: center;
  margin-top: 2%;
}

.todoList ul {
  list-style-type: none;
  margin-right: 30px;
  color: white;
  font-size: 26px;
  font-weight: 500
}

.todoList ul li {
  cursor: pointer;
}

.done {
  color: rgb(190, 190, 190);
  text-decoration: line-through
}

.note {
  display: flex;
  justify-content: center;
  margin-top: 10px;
  font-size: 14px;
  color: white;
}
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="css/style.css">
  <title>TodoApp</title>
</head>

<body>
  <div class="mainInput">
    <input type="text" class="input" id="input" placeholder="Enter your todo : ">
    <button class="btn" id="btn">+</button><button class="btn btn1" id="removeBtn">RemoveAll</button>
  </div>

  <span> Todo list : </span>
  <div class="todoList">
    <ul id="todoList"></ul>
  </div>

  <span class="note">Right click to make todo done</span>
  <span class="note">dbl click to remove todo</span>
  <script src="js/main.js"></script>
  <script src="https://kit.fontawesome.com/a81368914c.js"></script>
</body>

</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多