由于您正在学习 JavaScript,并查看您的代码和接受的答案,您应该注意以下 3 件事:
一个。不要innerHTML
用于添加单个DOM 元素。
在您的代码中,您正在执行 a ....innerHTML += ...
,这意味着innerHTML
每次都会重新标记并插入完整内容。
意思是,对于 10th li
,您要添加 10 个项目。对于 11th li
,您要删除 10 然后添加 11 个项目,而不是 1。这对性能不利,并且每次插入时都再次DOM
添加所有 s 是没有意义的。li
li
innerHTML
适合一次性操作。
乙。永远不要使用内联 JavaScript!
它有很多原因。此外,社区中的其他开发人员也讨厌它。看着一个使用它的问题,他们会逃跑。
<span onclick='this.parentNode.parentNode.removeChild(this.parentNode)' >
这很糟糕,很糟糕,非常糟糕!
C. _ 使用事件委托!
看看这个答案。
简而言之,li
与其为每个 设置多个点击功能,不如在 上设置一个功能ul
。如果您单击 anli
您也单击ul
。可以检查哪个li
被单击,ul
然后将其删除,如下所示:
HTML:
<form>
<input type='text' id='input' />
<input type='button' id='add-btn' value='Add' />
</form>
<ul id="do"> </ul>
JavaScript:
var doc = document,
parentUL = document.getElementById('do'),
addBtn = document.getElementById('add-btn');
addBtn.addEventListener('click', function() {
var input = doc.getElementById('input').value,
li = doc.createElement('li');
// use innerHTML only to set the conetnt of single DOM item
li.innerHTML = input + '<span style="cursor: pointer; color: red; margin-left: 20px" > x </span>';
// append only once on every create
parentUL.appendChild(li);
});
// delegate UL's click to li, by checking target item
parentUL.addEventListener('click', function(evt) {
// check the real target
var target = evt.target,
liNode = target.parentNode;
parentUL.removeChild(liNode);
});
注意:addEventListener
仅适用于现代浏览器。检查这个答案是否有跨浏览器的东西。
总的来说,所有这些对于您以前的小代码来说似乎是一种开销,但这是一个可以拯救世界和 JavaScript 的好习惯。
虽然您已经接受了答案,但我已经用上面的代码更新了小提琴