• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

javascript lista item programowanie

Object Storage Arubacloud
0 głosów
120 wizyt
pytanie zadane 26 sierpnia 2020 w JavaScript przez kubaa322 Użytkownik (710 p.)

Witam, robię bardzo prostą todo listę i napotkałem pierwszy problem. Otóż wszystko działa fajnie do momentu gdzie klikam przycisk z class = 'remove' który ma służyć do usuwania elementu listy(tylko jednego). Jednak odpalając poniższy kod działa tylko przycisk pierwszego elementu z listy a reszta nie działa. Na dodatek przycisk ten usuwa wszystkie elementy listy a nie tylko jeden. Z góry dziękuję za pomoc

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>To do list</title>
    <link rel = 'stylesheet' href = 'style.css'>
    <script src = 'main.js' defer></script>
</head>
<body>
    <input class = 'task-input' type = 'text' placeholder = 'New task'/>
    <button class = 'add-task'>Add task</button>
    <ul class = 'list'>

    </ul>
</body>
</html>

JS:

const list = document.querySelector('.list');
const addTask = document.querySelector('.add-task');
addTask.addEventListener('click', () => {
    const input = document.querySelector('.task-input').value;
    
    const taskItem = {
        name: input
    };
    const listItem = document.createElement('li');
    listItem.className = 'list-item';
    listItem.innerHTML = `
    <p>
    ${taskItem.name}
    <button class = 'remove'>-</button>
`;
list.append(listItem);
const remove = document.querySelector('.remove');
remove.addEventListener('click', () => {
    list.remove(listItem);
});
});

i jeśli ma to jakieś znaczenie to CSS:

body{
    margin: 0;
    padding: 0;
    background: #68b0ab;
}
.task-input{
    padding-left: 15px;
    font-family: Bahnschrift;
    font-weight: 1000;
    font-size: 25px;
    border-top-left-radius: 10px;
    border-bottom-left-radius: 10px;
    border: none;
    outline: none;
    width: 500px;
    height: 50px;
    position: absolute;
    top: 30%;
    left: 30%;
}
.add-task{
    font-family: Bahnschrift;
    font-weight: 1000;
    font-size: 25px;
    letter-spacing: 2px;
    border-top-right-radius: 10px;
    border-bottom-right-radius: 10px;
    width: 200px;
    height: 52px;
    background: #c8d5b9;
    border: none;
    outline: none;
    position: absolute;
    top: 30%;
    left: 56.2%;
}
.list{
    font-family: Bahnschrift;
    font-size: 25px;
    list-style-type: none;
    position: absolute;
    top: 50%;
    left: 47.5%;
    transform: translate(-50%, -50%);
    background: transparent;
    width: 800px;
    height: 100px;
}
.list-item{
    border-radius: 15px;
    font-family: Bahnschrift;
    font-size: 25px;
    line-height: 50px;
    background: #8fc0a9;
    height: 50px;
    padding-left: 20px;
}
.remove{
    font-family: Bahnschrift;
    font-size: 25px;
    line-height: 25px;
    background: #faf3dd;
    outline: none;
    border: none;
    border-radius: 5px;
    cursor: pointer;
}

 

komentarz 26 sierpnia 2020 przez VBService Ekspert (253,340 p.)

Nie zapomnij dodać coś na wzór

    const input = document.querySelector('.task-input').value;    
    if (input.trim() == "") return;

aby zapobiec dodawaniu pustego  task-a. wink

1 odpowiedź

0 głosów
odpowiedź 26 sierpnia 2020 przez ScriptyChris Mędrzec (190,190 p.)
const remove = document.querySelector('.remove');

To wyszukuje zawsze tylko pierwszy element o klasie remove w obrębie dokumentu (strony). Dlatego podpięcie się na click działa tylko dla pierwszego przycisku z tą klasą.

A przycisk ten usuwa wszystkie elementy, a nie tylko konkretny, ponieważ metoda remove usuwa element, w kontekście którego została wywołana - a więc całą listę - a nie, przekazane jako parametr, dziecko.

Naprawić to można np. w ten sposób:

  const remove = listItem.querySelector(".remove");
  remove.addEventListener("click", () => {
    list.removeChild(listItem);
  });

Przycisk remove pobrać szukając "z poziomu" zmiennej listItem, zamiast dokumentu i w listenerze użyć removeChild zamiast remove.

komentarz 26 sierpnia 2020 przez kubaa322 Użytkownik (710 p.)
Dzięki wielkie za wyjaśnienie

Podobne pytania

0 głosów
1 odpowiedź 225 wizyt
0 głosów
0 odpowiedzi 91 wizyt
pytanie zadane 19 stycznia 2019 w HTML i CSS przez Danielos Nowicjusz (240 p.)
+2 głosów
2 odpowiedzi 369 wizyt
pytanie zadane 30 sierpnia 2022 w JavaScript przez polandonion Mądrala (7,040 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...