【发布时间】:2019-01-02 21:09:33
【问题描述】:
这是我的应用程序的 JSFiddle 链接:https://jsfiddle.net/kdowdell24/a9t7b23c/2/
document.getElementById("add-button").addEventListener("click", function() {
function createNewItem() {
//creates div element with a class of "input-item"
let itemContainer = document.createElement("div");
itemContainer.classList.add("input-item");
//creates input element and sets type attribute to "checkbox"
let checkBoxInput = document.createElement("input");
checkBoxInput.setAttribute("type", "checkbox");
checkBoxInput.classList.add("check-box");
//creates input element and sets "type" attribute to "text"
let textInput = document.createElement("input");
textInput.setAttribute("type", "text");
//creates button element and sets "class" to "delete-button" and "type" to "button"
let deleteButton = document.createElement("button");
deleteButton.classList.add("delete-button");
deleteButton.setAttribute("type", "button");
//creates Font Awesome "X" icon and adds "fas" and "fa-times" classes
let xIcon = document.createElement("i");
xIcon.classList.add("fas");
xIcon.classList.add("fa-times");
//adds a div to form
let formElement = document.getElementById("shopping-list");
formElement.appendChild(itemContainer);
//adds checkbox, input, and "delete-button" to div
itemContainer.appendChild(checkBoxInput);
itemContainer.appendChild(textInput);
itemContainer.appendChild(deleteButton);
//adds "X" icon to button
deleteButton.appendChild(xIcon);
//removes checkbox, input and deleteButton from form
deleteButton.addEventListener("click", function() {
checkBoxInput.remove();
textInput.remove();
deleteButton.remove();
itemContainer.remove();
});
};
createNewItem();
//Adds new item after pressing Enter key
let itemList = document.querySelectorAll("input[type=text]");
for (var i = 0; i < itemList.length; i++) {
addEventListener("keypress", function(e) {
if (e.key === "Enter") {
createNewItem();
console.log("New item created!");
}
})
}
});
//Removes all content from list after pressing Clear All button
document.getElementById("clear-button").addEventListener("click", function() {
let listContent = document.querySelectorAll(".input-item");
for (var i = 0; i < listContent.length; i++) {
listContent[i].remove();
}
})
我遇到的问题是这段代码:
//Adds new item after pressing Enter key
let itemList = document.querySelectorAll("input[type=text]");
for (var i = 0; i < itemList.length; i++) {
addEventListener("keypress", function(e) {
if (e.key === "Enter") {
createNewItem();
console.log("New item created!");
}
})
}
发生的情况是,当我在列表项的文本框中按 Enter 时,它会添加多个条目,而不仅仅是一个。我想要完成的是在按下 Enter 后只在当前条目下方创建一个条目。
【问题讨论】:
-
您的侦听器正在运行多次,因为您将它保存在
for loop中。你到底需要在这里做什么?也请在您的问题中发布createNewItem()的代码。 -
嘿,@KrisD 您需要将 addEventListener 附加到某些东西上。它只是坐在那里。这可能会导致它附加到文档或窗口,这意味着您在同一个节点上有很多监听。
-
我要做的是让用户在文本框中按 Enter 后只创建一个额外的列表项。现在,它会在按 Enter 后一次创建多个。
-
这是因为所谓的事件冒泡。由于您将其附加到文档中,因为您没有清楚地说明事件侦听器将附加到您的内容,因此存在潜在的内存泄漏。这只是意味着您需要指定要将其附加到的输入。
标签: javascript for-loop if-statement event-listener enter