Event.currentTarget.parentNode.remove(); не работает

Я пытаюсь изучить то, что я привык делать в jQuery, на простом JavaScript.

У меня есть пример, который я нашел в Интернете, и мне пришлось его решить, и это доставило мне немало хлопот.

Я пытаюсь удалить родительский div. одиночное нажатие на кнопку. удалять.

Вот код;

<div class = "row" id = "showAward">

</div>
<div class = "w-100 text-center">
    <a id = "add" class = "bg-primary text-white px-3 py-2 rounded-circle cursor-pointer">
        <i class = "fa-solid fa-plus"></i>
    </a>
</div>

<script>
    let count = 0;

    document.addEventListener('click', function(event) {
        if (event.target.id === 'add') {
            count++;
            addAward(count);
        }
        if (event.target.classList.contains('delete')) {
            event.currentTarget.parentNode.remove();
        }
    });
    function addAward(number) {
        let html = `<div class = "col-lg-4 mb-3 position-relative">
            <label for = "image${number}" class = "form-label">image ${number}</label>
            <input type = "file" class = "form-control" id = "image${number}" name = "image${number}">
            <a class = "delete text-danger cursor-pointer position-absolute end-0 top-0"><i class = "fa-solid fa-times"></i></a>
        </div>`;
        document.getElementById('showAward').insertAdjacentHTML('beforeend', html);
    }

</script>

event.currentTarget — это элемент, которому был назначен прослушиватель кликов (документ). Не знаю, почему вы не использовали event.target.

James 17.03.2024 20:05
Поведение ключевого слова "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
1
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, что когда прослушиватель событий включен document, свойство curretnTarget равно undefined. Вместо этого используйте event.target. И тогда вместо использования parentNode используйте метод close(). Вы можете указать селектор CSS в качестве параметра метода и получить родительский элемент.

let count = 0;

document.addEventListener('click', function(event) {
  if (event.target.id === 'add') {
    count++;
    addAward(count);
  }
  if (event.target.classList.contains('delete')) {
    event.target.closest('div.position-relative').remove();
  }
});

function addAward(number) {
  let html = `<div class = "col-lg-4 mb-3 position-relative">
            <label for = "image${number}" class = "form-label">image ${number}</label>
            <input type = "file" class = "form-control" id = "image${number}" name = "image${number}">
            <a class = "delete text-danger cursor-pointer position-absolute end-0 top-0"><i class = "fa-solid fa-times"></i>Delete</a>
        </div>`;
  document.getElementById('showAward').insertAdjacentHTML('beforeend', html);
}
<div class = "row" id = "showAward">

</div>
<div class = "w-100 text-center">
  <a id = "add" class = "bg-primary text-white px-3 py-2 rounded-circle cursor-pointer">
    <i class = "fa-solid fa-plus"></i>Add
  </a>
</div>
Ответ принят как подходящий

Геттер EventcurrentTarget вернет EventTarget в пузырьковой цепочке, где событие отправляется на текущей фазе.
Он будет меняться динамически, и при синхронном получении от обратного вызова к EventTarget.addEventListener() это будет тот EventTarget, по которому вы вызвали addEventListener() (что делает его похожим на this в этом отношении).

const parent = document.querySelector(".parent");
const child = document.querySelector(".child");

const initialEvent = new Event("foobar", { bubbles: true });

let childEvent = null;
child.addEventListener("foobar", (evt) => {
  console.info("#### In child");
  childEvent = evt; // Store for later
  // It's actually the same object that is passed along
  console.info("initialEvent === evt", initialEvent === evt);
  console.info("evt.currentTarget", evt.currentTarget); // .child
  setTimeout(() => {
    console.info("#### In timeout from child");
    // currentTarget becomes null after the dispatch is done
    console.info("evt.currentTarget", evt.currentTarget);
  });
});
parent.addEventListener("foobar", (evt) => {
  console.info("#### In parent");
  // Still the same object
  console.info("initialEvent === evt", initialEvent === evt);
  console.info("evt.currentTarget", evt.currentTarget); // .parent
  console.info("childEvent.currentTarget", childEvent.currentTarget); // .parent
});

child.dispatchEvent(initialEvent);
console.info("#### After dispatch");
console.info("childEvent.currentTarget", childEvent.currentTarget); // null
<div class = "parent"><div class = "child"></div></div>

Итак, в вашем случае currentTarget в этом контексте будет узел Document, потому что вы вызвали document.addEventListener().

Теперь .target будет представлять собой EventTarget, на который было отправлено событие, т.е. в случае щелчка элемент, который получил щелчок.
Однако это может быть не то, чего вы ожидали. Например, в вашем случае щелчок по элементу <i>, который находится внутри элемента .delete, приведет к установке .target на этот элемент <i>, а не на элемент .delete, и, таким образом, вы пропустите щелчок.

Вместо этого при делегировании используйте .closest(), чтобы проверить, находится ли интересующий вас элемент в цепочке событий. Этот метод также возвращает элемент, в котором он был вызван, в случае совпадения.

document.addEventListener("click", (evt) => {
  console.info("target", evt.target);
  console.info("target is .delete", evt.target.classList.contains("delete"));
  const actualTarget = evt.target.closest(".delete");
  console.info("actualTarget", actualTarget);
});
<span class = "delete">
  <i>click me</i>
</span>

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