Длина массива не будет увеличиваться после опустошения и не может добавить событие мыши в HTMLCollection - PullRequest
0 голосов
/ 03 октября 2018

Я хочу создать свой список покупок / задач в JavaScript и HTML.Я могу добавить вещи в список без проблем, но у меня есть две проблемы:

  1. Если я добавил элементы в список, затем нажмите кнопку «Очистить», чтобы стереть все в списке, это работает.Однако, когда я добавляю вещи обратно в список после его очистки, моя консоль уведомляет меня, что мой массив все еще пуст, несмотря на новые задачи, отображаемые на экране.
  2. Моя вторая проблема больше.Видите ли, все мои задачи находятся в том, что я считал массивом, но на самом деле это коллекция HTML.Поэтому, когда я пытаюсь установить событие onclick, оно просто не запускается.Я понятия не имею, почему, и я попытался использовать следующий вопрос: Удаление элементов HTMLCollection из DOM .Это не сработало.Я пытался использовать item, HTMLCollection item () Метод .Не сработалоМоя последняя попытка использовала for(let thing of..., но все еще безрезультатно.

Вот мой код:

let listGro = document.getElementById("list");

let aButton = document.getElementById("add");
let cButton = document.getElementById("clear");
let tasks = document.getElementsByTagName("li");


aButton.onclick = function addItem() {
    let newThing = prompt("What do you want to add?"); // asking what the person wants

    if (newThing) { // checking if the user actually added something
        let newItemList = document.createElement("li"); //create item list
        newItemList.className = "item";
        let newItemListText = document.createTextNode(newThing); // create text
        newItemList.appendChild(newItemListText); // append text
        listGro.appendChild(newItemList); // append new element
        console.log(`New task added\nNumber of tasks in the list: ${tasks.length}`);
    } else {
        alert("You can't add nothing");
    }

};

cButton.onclick = function clearList() {
    var conf = confirm("Are you sure you want to clear the list?");
    if (conf && tasks.length != 0) {
        for (let i = 0; i < tasks.length; i++) {
            tasks[i].style.display = "none";
        }
        tasks = [];
    }

}

for(let thing of tasks) {
    //tasks[i].onclick = function removeOrEditItem() {
        /*let demand = prompt("Do you want to edit or remove the item?\nPlease answer with 'edit' or 'remove'\nIf this is a mistake, just enter nothing.");
        if (demand === "edit") {
            let editItem = prompt("What is your new thing?");
            tasks[i].innerHTML = editItem;
        } else if (demand === "remove") {
            tasks[i].splice(i, 1);
        }
        console.log("clicked");
    };*/
    
    // The thing above was a previous attempt with for(let i; i< items.length... you can work with that or below.
    thing.onclick = function removeTask() {
        thing.style.display = "none";
        console.log("removed");
    }
}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Website template</title>
		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"/>
    </head>
    <body>
        <h1>Grocery lists manager</h1>
        <h2>Welcome! here you can manage your grocery list!</h2>
        <ul id = "list"><span>List:</span></ul>
        <button id = "add">Add</button>
        <button id = "clear">Clear list</button>
    </body>
    <script src = "script.js"></script>
</html>

1 Ответ

0 голосов
/ 04 октября 2018

Список задач остается пустым, когда вы его очищаете, потому что вы перезаписываете коллекцию HTML пустым массивом.Вы назначили document.getElementsByTagName("li"); на tasks, который является живой коллекцией.Переназначение [] для него даст ему неживой пустой массив.Вместо того, чтобы визуально скрывать задачи с помощью tasks[i].style.display="none и вручную сбрасывать коллекцию tasks, вы должны удалить каждый элемент задачи из DOM и позволить обновлению вашей живой коллекции автоматически.

Удаление коллекции из DOM имеетнекоторые подводные камни, но, как правило, они могут быть выполнены следующим образом:

while(tasks.length > 0) {
    tasks[0].parentNode.removeChild(tasks[0]);
}

Ваши прослушиватели событий не добавляются, потому что код, который добавляет их, запускается только один раз, когда загружается скрипт.И, конечно же, в случае, когда скрипт загружен, в списке нет задач.Добавьте прослушиватель событий к отдельному newItemList при первом добавлении.

Убедитесь, что вы удалили задачу из DOM, а не просто скрыли ее.

 newItemList.onclick = function removeTask() {
     newItemList.parentNode.removeChild(newItemList);
     console.log("removed");
 }

Ваш полный JavaScript может выглядеть так:

let listGro = document.getElementById("list");
let aButton = document.getElementById("add");
let cButton = document.getElementById("clear");
let tasks = document.getElementsByTagName("li");

aButton.onclick = function addItem() {
    let newThing = prompt("What do you want to add?"); // asking what the person wants

    if (newThing) { // checking if the user actually added something
        let newItemList = document.createElement("li"); //create item list
        newItemList.className = "item";
        let newItemListText = document.createTextNode(newThing); // create text
        newItemList.appendChild(newItemListText); // append text
        newItemList.onclick = function removeTask() {
            newItemList.parentNode.removeChild(newItemList);
            console.log("removed");
        }
        listGro.appendChild(newItemList); // append new element
        console.log(`New task added\nNumber of tasks in the list: ${tasks.length}`);
    } else {
        alert("You can't add nothing");
    }
};

cButton.onclick = function clearList() {
    var conf = confirm("Are you sure you want to clear the list?");
    if (conf && tasks.length != 0) {
        while(tasks.length > 0) {
            tasks[0].parentNode.removeChild(tasks[0]);
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...