Кнопка JavaScript не работает

Я создаю расширение Chrome, которое позволяет пользователю создавать список дел. Пользователь может добавлять и отмечать задачи. Я добавил кнопку удаления, но кнопка удаления не работает. Когда я нажимаю кнопку удаления, ничего не происходит.

$(() => {
  $('input').on('keypress', function(e) {
    if (e.keyCode == 13) {
      const newTask = $(this).val();
      if (newTask) {
        var li = $("<li><input type='checkbox' id='newtasklist' class='right-margin' <label>" + newTask + "</label> <button type='button' class='deletetask'>Delete</button> </li>");
        $('#tasksUL').append(li);
        $(this).val("");
      }
    }
  });
  $('body').on('click', ':checkbox', function(e) {
    $(this).parent().toggleClass('selected');
  });
  $('.deletetask').on("click", function() {
    $(this).parent().remove();
  });
});
.selected {
  text-decoration: line-through;
  font-size: 20px;
}
<input type = "text" name = "newtask" value = "" spellcheck = "false" placeholder = "New Task" id = "newtask">
<ul id = "tasksUL">
</ul>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
48
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы динамически создаете кнопку в своем JS-файле. Добавьте в документ прослушиватель событий по щелчку, а затем отфильтруйте класс задачи удаления.

Попробуй это:

$(document).on("click", ".deletetask", function() {
  $(this).parent().remove();
}

Это должно заменить ваш текущий прослушиватель событий .deletetask.

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

Matt 11.07.2019 05:58

Причина, по которой он не работает должным образом, заключается в том, что этот класс deletetask динамически генерируется вашим JS. Существующий прослушиватель событий не привязан к динамически созданному классу, поэтому он никогда не узнает, что класс был выбран. Вам нужно, чтобы ваш прослушиватель событий прослушивал откуда-то выше этого класса в DOM. Есть несколько разных способов справиться с этим:

(Как упомянул другой пользователь)

$(document).on('click', '.deletetask', function() {
  $(this).parent().remove();
}

Этот код выше прослушивает весь объект JS document, что не является самым эффективным использованием ресурсов, но выполняет свою работу. Этот метод может быть полезен, если класс deletetask вставлен в разные места, и вы хотите, чтобы один прослушиватель событий мог обрабатывать события кликов.

Однако способ более эффективным сделать это состоит в том, чтобы использовать идентификатор родителя tasksUL (или класс тоже подойдет), который уже находится на странице с самого начала, как ваш прослушиватель событий, например:

$('#tasksUL').on('click', '.deletetask', function() {
  $(this).parent().remove();
}

Этот раздел кода будет прослушивать любое событие щелчка внутри вашего идентификатора tasksUL, которое происходит в классе deletetask, и он прослушивает только эти события щелчка, а не прослушивает каждое событие щелчка в document.

Другие вопросы по теме