Javascript- 活动不能与其他活动一起使用
Javascript- Event dosen't work with the other event
我正在尝试使用纯 javascript 开发 "todo" 应用程序。我创建了一个 "newTask" 事件,它也有效,之后我创建了 deleteTask
事件并且它也有效。但我意识到我无法使用 deleteTask
事件代码创建新任务,如果我删除 deleteTask 代码,它会再次运行吗?
我这里的错误是什么?
const task = document.querySelector('#task');
const form = document.querySelector('#task-form');
const ul = document.querySelector('ul');
form.addEventListener('submit', newTask);
document.body.addEventListener('click', deleteTask);
function newTask(e) {
if (task.value) {
let li = document.createElement('li');
li.className = "collection-item";
li.appendChild(document.createTextNode(task.value));
let href = document.createElement('a');
href.className = "delete-item secondary-content";
href.innerHTML = '<i class="fa fa-remove"></i>';
href.setAttribute('href', '#');
li.appendChild(href);
ul.appendChild(li);
} else {
alert('Please type something');
}
e.preventDefault();
form.reset();
}
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
}
e.preventDefault();
}
<body>
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List</span>
<div class="row">
<p style="background-color:red;color:white;text-align:center" id="error"></p>
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task</label>
</div>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<ul class="collection">
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
</ul>
<button class="btn black" id="clear-tasks">Clear Tasks</button>
</div>
</div>
</div>
</div>
</div>
把e.preventDefault()
放在if
里面。否则,它会阻止 click
事件传播到其他元素。
我知道你说你试过了,但它在这里有效。
const task = document.querySelector('#task');
const form = document.querySelector('#task-form');
const ul = document.querySelector('ul');
form.addEventListener('submit', newTask);
document.body.addEventListener('click', deleteTask);
function newTask(e) {
if (task.value) {
let li = document.createElement('li');
li.className = "collection-item";
li.appendChild(document.createTextNode(task.value));
let href = document.createElement('a');
href.className = "delete-item secondary-content";
href.innerHTML = '<i class="fa fa-remove">X</i>';
href.setAttribute('href', '#');
li.appendChild(href);
ul.appendChild(li);
} else {
alert('Please type something');
}
e.preventDefault();
form.reset();
}
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
e.preventDefault();
}
}
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List</span>
<div class="row">
<p style="background-color:red;color:white;text-align:center" id="error"></p>
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task</label>
</div>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<ul class="collection">
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
</ul>
<button class="btn black" id="clear-tasks">Clear Tasks</button>
</div>
</div>
</div>
</div>
</div>
以下事件处理程序捕获 所有 正文点击:
document.body.addEventListener('click', deleteTask);
因此,当您在 deleteTask
函数中阻止点击时的默认行为时,您也会阻止其他按钮的默认行为,包括 "add task" 按钮。
鉴于您已经检查了点击的目标,您还应该仅阻止该情况下的默认点击操作:
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
e.preventDefault(); // Move preventDefault here
}
}
const task = document.querySelector('#task');
const form = document.querySelector('#task-form');
const ul = document.querySelector('ul');
form.addEventListener('submit', newTask);
document.body.addEventListener('click', deleteTask);
function newTask(e) {
if (task.value) {
let li = document.createElement('li');
li.className = "collection-item";
li.appendChild(document.createTextNode(task.value));
let href = document.createElement('a');
href.className = "delete-item secondary-content";
href.innerHTML = '<i class="fa fa-remove"></i>';
href.setAttribute('href', '#');
li.appendChild(href);
ul.appendChild(li);
} else {
alert('Please type something');
}
e.preventDefault();
form.reset();
}
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
e.preventDefault();
}
//
}
<body>
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List</span>
<div class="row">
<p style="background-color:red;color:white;text-align:center" id="error"></p>
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task</label>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<ul class="collection">
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
</ul>
<button class="btn black" id="clear-tasks">Clear Tasks</button>
</div>
</div>
</div>
</div>
</div>
我正在尝试使用纯 javascript 开发 "todo" 应用程序。我创建了一个 "newTask" 事件,它也有效,之后我创建了 deleteTask
事件并且它也有效。但我意识到我无法使用 deleteTask
事件代码创建新任务,如果我删除 deleteTask 代码,它会再次运行吗?
我这里的错误是什么?
const task = document.querySelector('#task');
const form = document.querySelector('#task-form');
const ul = document.querySelector('ul');
form.addEventListener('submit', newTask);
document.body.addEventListener('click', deleteTask);
function newTask(e) {
if (task.value) {
let li = document.createElement('li');
li.className = "collection-item";
li.appendChild(document.createTextNode(task.value));
let href = document.createElement('a');
href.className = "delete-item secondary-content";
href.innerHTML = '<i class="fa fa-remove"></i>';
href.setAttribute('href', '#');
li.appendChild(href);
ul.appendChild(li);
} else {
alert('Please type something');
}
e.preventDefault();
form.reset();
}
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
}
e.preventDefault();
}
<body>
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List</span>
<div class="row">
<p style="background-color:red;color:white;text-align:center" id="error"></p>
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task</label>
</div>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<ul class="collection">
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
</ul>
<button class="btn black" id="clear-tasks">Clear Tasks</button>
</div>
</div>
</div>
</div>
</div>
把e.preventDefault()
放在if
里面。否则,它会阻止 click
事件传播到其他元素。
我知道你说你试过了,但它在这里有效。
const task = document.querySelector('#task');
const form = document.querySelector('#task-form');
const ul = document.querySelector('ul');
form.addEventListener('submit', newTask);
document.body.addEventListener('click', deleteTask);
function newTask(e) {
if (task.value) {
let li = document.createElement('li');
li.className = "collection-item";
li.appendChild(document.createTextNode(task.value));
let href = document.createElement('a');
href.className = "delete-item secondary-content";
href.innerHTML = '<i class="fa fa-remove">X</i>';
href.setAttribute('href', '#');
li.appendChild(href);
ul.appendChild(li);
} else {
alert('Please type something');
}
e.preventDefault();
form.reset();
}
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
e.preventDefault();
}
}
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List</span>
<div class="row">
<p style="background-color:red;color:white;text-align:center" id="error"></p>
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task</label>
</div>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<ul class="collection">
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
</ul>
<button class="btn black" id="clear-tasks">Clear Tasks</button>
</div>
</div>
</div>
</div>
</div>
以下事件处理程序捕获 所有 正文点击:
document.body.addEventListener('click', deleteTask);
因此,当您在 deleteTask
函数中阻止点击时的默认行为时,您也会阻止其他按钮的默认行为,包括 "add task" 按钮。
鉴于您已经检查了点击的目标,您还应该仅阻止该情况下的默认点击操作:
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
e.preventDefault(); // Move preventDefault here
}
}
const task = document.querySelector('#task');
const form = document.querySelector('#task-form');
const ul = document.querySelector('ul');
form.addEventListener('submit', newTask);
document.body.addEventListener('click', deleteTask);
function newTask(e) {
if (task.value) {
let li = document.createElement('li');
li.className = "collection-item";
li.appendChild(document.createTextNode(task.value));
let href = document.createElement('a');
href.className = "delete-item secondary-content";
href.innerHTML = '<i class="fa fa-remove"></i>';
href.setAttribute('href', '#');
li.appendChild(href);
ul.appendChild(li);
} else {
alert('Please type something');
}
e.preventDefault();
form.reset();
}
function deleteTask(e) {
if (e.target.classList.contains('fa-remove')) {
e.target.parentElement.parentElement.remove();
e.preventDefault();
}
//
}
<body>
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List</span>
<div class="row">
<p style="background-color:red;color:white;text-align:center" id="error"></p>
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task</label>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<ul class="collection">
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
<li class="collection-item">
List Item
<a href="#" class="delete-item secondary-content">
<i class="fa fa-remove"></i>
</a>
</li>
</ul>
<button class="btn black" id="clear-tasks">Clear Tasks</button>
</div>
</div>
</div>
</div>
</div>