简体   繁体   English

添加/删除项目列表

[英]Add/Remove item list

I'm practicing with javascript . 我正在用javascript练习。 I built a grocery list in which I would like to add and remove items. 我建立了一个购物清单,我想在其中添加和删除商品。 Adding elements works fine by typing a name in a input form and pushing the send button. 通过在输入表单中输入名称并按下发送按钮,可以很好地添加元素。 I'd like to remove the element that I just created by clicking on it but I get this error instead: 我想通过单击删除刚刚创建的元素,但出现此错误:

"Uncaught TypeError: Cannot read property 'removeChild' of undefined at HTMLDocument.removeItem" “未捕获的TypeError:无法读取HTMLDocument.removeItem中未定义的属性'removeChild'”

here the code: 这里的代码:

HTML:- HTML: -

<div id="paper">
    <h3 id="title">Groceries list:</h3>
    <ul id="list">
        <li></li>
    </ul>
</div>

<p class="grocery">
    <input type="text" name="grocery" placeholder="ex. Apple" id="blank" />
    <label for="grocery">Grocery Name</label>
</p>

<p class="submit">
    <input type="submit" value="SEND" id="btn" />
</p>


<script type="text/javascript" src="js/script.js"></script>

CSS:- CSS: -

#paper {
   width: 300px;
   height: auto;
   margin: 20px auto;
   clear: both;
   background-color: orange;
}

.grocery, .submit{
   text-align: center;
   margin: 20px;
}

Javascript:- 使用Javascript: -

var elList = document.getElementById("list");
var elButton = document.getElementById("btn");

function addItem(e) {
   var elElement = document.createElement("li");
   var whatever = el.value;
   var elText = document.createTextNode(whatever);
   elElement.appendChild(elText);
   elList.appendChild(elElement);
}

function removeItem(e) {
   var elElement = document.getElementsByTagName("li");
   var elContainer = elElement.parentNode;
   elContainer.removeChild(elElement);
}

var el = document.getElementById("blank");

elButton.addEventListener("click", addItem, false);

if ("DOMNodeInserted") {
   document.addEventListener("click", removeItem, false);
}

How could I get through this? 我该如何解决? Thank you guys for your help 谢谢你们的帮助

if ("DOMNodeInserted") { document.addEventListener("click", removeItem, false); } if ("DOMNodeInserted") { document.addEventListener("click", removeItem, false); } is wrong. if ("DOMNodeInserted") { document.addEventListener("click", removeItem, false); }是错误的。 you need to attach this event handler to each list you create. 您需要将此事件处理程序附加到您创建的每个列表。 you can do that in addItem() using elElement.addEventListener("click", removeItem, false); 您可以使用elElement.addEventListener("click", removeItem, false);addItem()操作elElement.addEventListener("click", removeItem, false); , then in removeItem(e) just use e to get current element using e.currentTarget and remove it. ,然后在removeItem(e)使用e通过e.currentTarget获取当前元素并将其删除。

This seems to work: 这似乎可行:

 var elList = document.getElementById("list"); var elButton = document.getElementById("btn"); function addItem(e) { var elElement = document.createElement("li"); var whatever = el.value; var elText = document.createTextNode(whatever); elElement.appendChild(elText); elList.appendChild(elElement); elElement.addEventListener("click", removeItem, false); } function removeItem(e) { var elElement = e.currentTarget; var elContainer = elElement.parentNode; elContainer.removeChild(elElement); } var el = document.getElementById("blank"); elButton.addEventListener("click", addItem, false); 
 #paper { width: 300px; height: auto; margin: 20px auto; clear: both; background-color: orange; } .grocery, .submit{ text-align: center; margin: 20px; } 
 <div id="paper"> <h3 id="title">Groceries list:</h3> <ul id="list"> <li></li> </ul> </div> <p class="grocery"> <input type="text" name="grocery" placeholder="ex. Apple" id="blank" /> <label for="grocery">Grocery Name</label> </p> <p class="submit"> <input type="submit" value="SEND" id="btn" /> </p> 

Your problem is here: 您的问题在这里:

function removeItem(e) {
   var elElement = document.getElementsByTagName("li");
   var elContainer = elElement.parentNode;
   elContainer.removeChild(elElement);
}

This document.getElementsByTagName return an HTMLElementCollection which does not have the a property called parentNode . document.getElementsByTagName返回一个HTMLElementCollection,该HTMLElementCollection没有名为parentNode的属性。 An element from that collection would. 该集合中的元素会。

To avoid the undefined error, you need to check if your object is null or undefined before trying to call a method on in such as .removeChild . 为避免发生未定义的错误,您需要在尝试调用诸如.removeChild类的方法之前,检查对象是否为null或未定义。

In your case, elContainer is null because the elElement is an HTMLElementCollection which doesn't have the .parentNode property. 在您的情况下, elContainer为null,因为elElement是不具有.parentNode属性的HTMLElementCollection。

You can access elements in the collection by index. 您可以按索引访问集合中的元素。 It also has a length property which you should check to make sure that the collection has elements. 它还具有length属性,您应该检查该属性以确保该集合具有元素。

So if you want to remove the first LI, they you can do it like this. 因此,如果您要删除第一个LI,则可以这样做。

function removeItem(e) {
   var elements= document.getElementsByTagName("li");
   if (elements.length==0) return;
   var elElement = elements[0];
   var elContainer = elElement.parentNode;
   elContainer.removeChild(elElement);
}

So if you want to remove the that last LI, they you can do it like this. 因此,如果您要删除最后一个LI,则可以这样操作。

function removeItem(e) {
   var elements= document.getElementsByTagName("li");
   if (elements.length==0) return;
   var elElement = elements[elements.length-1];
   var elContainer = elElement.parentNode;
   elContainer.removeChild(elElement);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM