【发布时间】:2019-04-26 22:49:32
【问题描述】:
我在下面给出了 2 个代码--
代码 1:
下面是我的代码,它使用querySelector 来选择我要删除的类名。
但它只删除第一个列表元素,不适用于剩余的列表,其类名也与第一个列表元素相同。
为什么在删除第一个列表元素后这不起作用(在删除第一个列表后,类名“删除”也仍然存在并且对它们不起作用)?
现在转到 代码 2,这是我对问题的解决方案。
//JAVASCRIPT ----CODE 1-----
let ol = document.querySelector('.remove');
ol.addEventListener('click',function(e){
let length = document.querySelectorAll('li').length;
if(length > 1){//ignore to remove all list
let remove = e.target.parentNode;
remove.parentNode.removeChild(remove);
}
});
/* CSS*/
ol li {
background-color: rgb(104, 144, 113);
margin: 10px 0px;
padding: 10px;
max-width: 250px
}
li span.remove {
float: right;
font-size: 20px;
font-weight: 1000;
color: red;
cursor: pointer;
background-color: silver;
display: inline-block;
width: 23px;
border-radius: 50px;
text-align: center;
}
<!-- HTML -->
<div><p>click on minus icon to remove list item</p>
<ol>
<li>list1 <span class="remove"> - </span></li>
<li>list2 <span class="remove"> - </span></li>
<li>list3 <span class="remove"> - </span></li>
<li>list4 <span class="remove"> - </span></li>
<li>list5 <span class="remove"> - </span></li>
</ol>
</div>
代码2:代码1的解法。
我在这里使用
querySelector 表示 ol,它是有序列表,在 querySelector 内部我使用if(e.target.className == "remove") 删除列表项。//JAVASCRIPT ----CODE 2-----
let ol = document.querySelector('ol');
ol.addEventListener('click',function(e){
if(e.target.className == "remove"){ // only select element which has class name 'remove'
let length = document.querySelectorAll('li').length;
if(length > 1){ //ignore to remove all list
let remove = e.target.parentNode;
remove.parentNode.removeChild(remove);
}
}
});
/* CSS same as in code 1*/
ol li {
background-color: rgb(104, 144, 113);
margin: 10px 0px;
padding: 10px;
max-width: 250px
}
li span.remove {
float: right;
font-size: 20px;
font-weight: 1000;
color: red;
cursor: pointer;
background-color: silver;
display: inline-block;
width: 23px;
border-radius: 50px;
text-align: center;
}
<!-- HTML same as in code 1-->
<div><p>click on minus icon to remove list item</p>
<ol>
<li>list1 <span class="remove"> - </span></li>
<li>list2 <span class="remove"> - </span></li>
<li>list3 <span class="remove"> - </span></li>
<li>list4 <span class="remove"> - </span></li>
<li>list5 <span class="remove"> - </span></li>
</ol>
</div>
帮帮我: 但我不想使用:
document.querySelector('ol') 选择整个有序列表,因此会浪费内存。我想实现我的答案,即只选择类名“删除”而不是整个有序列表。
我们可以使用
let ol = document.querySelectorAll('span.remove')选择类名称“删除”的所有元素,这些元素作为数组存储在 变量 ol 但在它之后我们如何选择那个数组元素 将被删除?
【问题讨论】:
-
您是否已经确定浪费内存是否会对您的应用程序产生任何负面影响? 如果您还没有这样做,那么您的问题实际上是没有实际意义的。
-
@RobertHarvey 我还没有确定,但是为什么我们将无用的数据存储在内存中?一个有序列表可能包含“数百万”个递归列表,因此将数百万个列表存储在一个变量中对于只需要一些元素的时间复杂度来说是不利的。这就是我问问题的原因。
-
@Abhishekkamal 将事件处理程序附加到
<ol>是一个函数,因为只有一个<ol>。如果您为每个<li>附加一个事件处理程序,那么您最终会在内存中得到许多副本,因为有<li>元素,这意味着<ol>方法实际上可能更节省内存。你测试过你假设的记忆差异吗?
标签: javascript dom-events