Я пытаюсь изучить то, что я привык делать в 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>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, что когда прослушиватель событий включен 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>
event.currentTarget — это элемент, которому был назначен прослушиватель кликов (документ). Не знаю, почему вы не использовали event.target.