在 JavaScript 中使用 Node.remove() 删除 li 不起作用
我目前正在尝试通过单击删除按钮来删除 li。 这是我的完整 JS 代码。
const form = document.querySelector('#form');
const savedList = document.getElementById('savedList');
const doneList = document.getElementById('doneList');
form.addEventListener('submit', (e) => {
const li = document.createElement('li');
li.innerText = document.getElementById('input').value;
li.id = li.innerText;
li.isDone = false;
li.isDone ? doneList.append(li) : savedList.append(li);
const deleteButton = document.createElement('button');
deleteButton.innerText = 'x';
deleteButton.id = 'deleteButton';
li.append(deleteButton);
li.addEventListener('click', () => {
li.isDone ? (li.isDone = false) : (li.isDone = true);
li.isDone ? doneList.append(li) : savedList.append(li);
});
deleteButton.addEventListener('click', function(event) {
const targetToDo = event.currentTarget.parentNode;
console.log(targetToDo.parentNode);
targetToDo.parentNode.remove(targetToDo);
targetToDo.remove();
});
e.preventDefault();
});
<form id="form">
<input id="input" type="text" />
<button type="submit">Submit</button>
</form>
<ul id="savedList"></ul>
<ul id="doneList"></ul>
但是,除 targetToDo 之外的其他 li 都将被删除。我尝试使用 console.log 进行调试,但 targetToDo 及其parentNode 没问题。我可以看到 li 代表 targetToDo,ul 代表其父节点。我该如何解决这个问题?提前致谢。
I am currently trying to delete li by clicking deleteButton.
This is my full JS code.
const form = document.querySelector('#form');
const savedList = document.getElementById('savedList');
const doneList = document.getElementById('doneList');
form.addEventListener('submit', (e) => {
const li = document.createElement('li');
li.innerText = document.getElementById('input').value;
li.id = li.innerText;
li.isDone = false;
li.isDone ? doneList.append(li) : savedList.append(li);
const deleteButton = document.createElement('button');
deleteButton.innerText = 'x';
deleteButton.id = 'deleteButton';
li.append(deleteButton);
li.addEventListener('click', () => {
li.isDone ? (li.isDone = false) : (li.isDone = true);
li.isDone ? doneList.append(li) : savedList.append(li);
});
deleteButton.addEventListener('click', function(event) {
const targetToDo = event.currentTarget.parentNode;
console.log(targetToDo.parentNode);
targetToDo.parentNode.remove(targetToDo);
targetToDo.remove();
});
e.preventDefault();
});
<form id="form">
<input id="input" type="text" />
<button type="submit">Submit</button>
</form>
<ul id="savedList"></ul>
<ul id="doneList"></ul>
However, other lis except targetToDo are being deleted. I've tried debugging with console.log but targetToDo and its parentNode is okay. I can see li for a targetToDo and ul for its parentNode. How can I fix this? Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
试试这个...
插图
希望,遵循基本设置以及 OP 中用于插图的代码更接近 OP 的需求。
所见即所得
=>所见即所得
Try this...
Illustration
Hopefully, following rudimentary setup along with the code in OP for illustration is closer to the needs of the OP.
WYSIWYG
=>WHAT YOU SHOW IS WHAT YOU GET
您需要使用 event.stopPropagation()
deleteButton.addEventListener
的末尾。它会解决你的问题。您的代码发生的情况如下。
x
按钮时,它将调用该按钮
的单击事件以及li
的单击事件。x
& 的点击事件。从deleteButton.addEventListener
中,它将删除您的li
。li
的点击事件,并根据li.addEventListener
中的代码将li
移动到其他ul
>。stopPropagation()
方法/a> 接口防止当前事件在捕获和冒泡阶段进一步传播。deleteButton.addEventListener
中使用event.stopPropagation()
,那么它将阻止进一步调用li
点击事件,并且不会能够将li
再次添加到其他ul
中。尝试下面的代码。
You need to use event.stopPropagation() at the end of your
deleteButton.addEventListener
. It will fix your problem.What is happening with your code is as below.
x
button it will invoke click event for thatbutton
as well as click event ofli
.x
& fromdeleteButton.addEventListener
it will remove yourli
.li
and as per code fromli.addEventListener
it will moveli
to otherul
.stopPropagation()
method of the Event interface prevents further propagation of the current event in the capturing and bubbling phases.event.stopPropagation()
in yourdeleteButton.addEventListener
then it will prevent further invoke ofli
click event and it won't be able to addli
again to otherul
.Try code below.