javascript - 在 JavaScript 中创建删除按钮以删除购物 list 项目

标签 javascript dom

我尝试过自己做这件事,甚至阅读了其他人对此练习的解决方案,但我就是不明白。我需要有人给我关于如何使删除按钮发挥作用的建议。这就是我到目前为止所做的

var button = document.getElementById("enter");
var input = document.getElementById("userinput");
var ul = document.querySelector("ul");
var buttonDlt = document.querySelectorAll("delete");

function inputLength() {
    return input.value.length;
}

function createListElement() {
    var li = document.createElement("li");
    li.appendChild(document.createTextNode(input.value));
    ul.appendChild(li);
    input.value = "";
}

function addListAfterClick() {
    if (inputLength() > 0) {
        createListElement();
    }
}

function addListAfterKeypress(event) {
    if (inputLength() > 0 && event.keyCode === 13) {
        createListElement();
    }
}

function deleteAfterClick() {
    li.remove(button.addEventListener("click"));

}

button.addEventListener("click", addListAfterClick);
buttonDlt.addEventListener("click", deleteAfterClick);
input.addEventListener("keypress", addListAfterKeypress);
<!DOCTYPE html>
<html>
<head>
    <title>Javascript + DOM</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <h1>Shopping List</h1>
    <p id="first">Get it done today</p>
    <input id="userinput" type="text" placeholder="enter items">
    <button id="enter">Enter</button>
    <ul>
        <li class="bold red" random="23">Notebook <button class="delete">Delete</button> </li>
        <li>Jello <button class="delete">Delete</button></li>
        <li>Spinach <button class="delete">Delete</button></li>
        <li>Rice <button class="delete">Delete</button></li>
        <li>Birthday Cake <button class="delete">Delete</button></li>
        <li>Candles <button class="delete">Delete</button></li>
    </ul>
    <script type="text/javascript" src="script.js"></script>
</body>
</html>

我添加了事件监听器,声明了所有涉及的变量和元素。我无法弄清楚我错过了什么......

最佳答案

您有:var buttonDlt = document.querySelectorAll("delete");,它返回一个节点列表(匹配元素的集合)。集合没有 .addEventListener() 方法,因此这一行:

buttonDlt.addEventListener("click", deleteAfterClick);

失败,因此当您单击删除按钮时不会发生任何事情。

您需要做的是迭代集合中的所有项目并将它们绑定(bind)到删除事件处理程序,或者您可以在更高级别处理该事件,然后确定哪个元素触发了该事件并采取相应的操作。这种方法称为 "event delegation"并导致更少的代码(无需循环遍历集合并向每个项目注册事件处理程序)和更好的性能(而不是许多事件注册,只有一个)。此外,当应具有事件绑定(bind)的新元素动态添加到文档中时(就像您在此处创建新的购物列表项目一样),这种方法是首选,因为这些新项目不必使用显式事件处理程序进行设置。

此外,删除项目的代码:

li.remove(button.addEventListener("click"));

不正确。

请参阅下面的内联评论:

var button = document.getElementById("enter");
var input = document.getElementById("userinput");
var ul = document.querySelector("ul");


function inputLength() {
    return input.value.length;
}

function createListElement() {
    var li = document.createElement("li");
    li.appendChild(document.createTextNode(input.value));
    
    // Create a delete button and configure it:
    var btnDelete = document.createElement("button");
    btnDelete.classList.add("delete");
    btnDelete.textContent = "Delete";
    
    // Append the button to the list item
    li.appendChild(btnDelete);
    ul.appendChild(li);
    input.value = "";
}

function addListAfterClick() {
    if (inputLength() > 0) {
        createListElement();
    }
}

function addListAfterKeypress(event) {
    if (inputLength() > 0 && event.keyCode === 13) {
        createListElement();
    }
}

function deleteAfterClick(event) {
  // Determine if it was a delete button that was clicked
  if(event.target.classList.contains("delete")){
    // Remove the closest li ancestor to the clicked element
    event.target.closest("li").remove();
  }

}

button.addEventListener("click", addListAfterClick);

// keypress is deprecated, use keydown instead
input.addEventListener("keydown", addListAfterKeypress);

// Handle all the clicks that originate from within the <ul> at
// the <ul> level when they bubble up to it instead of setting each
// button within the <ul> up with its own click event handler.
ul.addEventListener("click", deleteAfterClick);
<!DOCTYPE html>
<html>
<head>
    <title>Javascript + DOM</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <h1>Shopping List</h1>
    <p id="first">Get it done today</p>
    <input id="userinput" type="text" placeholder="enter items">
    <button id="enter">Enter</button>
    <ul>
        <li class="bold red" random="23">Notebook <button class="delete">Delete</button> </li>
        <li>Jello <button class="delete">Delete</button></li>
        <li>Spinach <button class="delete">Delete</button></li>
        <li>Rice <button class="delete">Delete</button></li>
        <li>Birthday Cake <button class="delete">Delete</button></li>
        <li>Candles <button class="delete">Delete</button></li>
    </ul>
</body>
</html>

关于javascript - 在 JavaScript 中创建删除按钮以删除购物 list 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59506089/

相关文章:

javascript - 如何使用 php 和 mysql 验证单选按钮?

javascript - location.replace() 的 Polyfill

javascript - 如何根据动态变化的 d3 vis 中的数据值重新排列 svg 元素的 DOM 顺序?

javascript - 长时间运行函数的 DOM 刷新

javascript - 如何使用 jQuery AJAX 和 PHP 使用 <a> 标签将表单提交到 mySQL 数据库中?

javascript - 使用 php、javascript 在 Web 应用程序中使用连接到 PC 的扫描仪

javascript - 是否可以使用该 iframe 内页面中存在的 javascript 更改 iframe src?

javascript - IE6 : Doesn't load Google Maps API v3

javascript - 隐藏弹出框功能 恢复打开弹出框功能

javascript - 使用正则表达式从正文元素中选择单个文本字符