Как изменить интерактивный элемент в onclick-Events после загрузки страницы?

#javascript #onclick

#javascript #onclick

Вопрос:

Когда страницы загружаются, есть один элемент, который должен запускать функцию при нажатии на него:

 var myArray = document.querySelectorAll(".my-element");

myArray[(myArray.length)-1].onclick = function() {  
    // function content
}
  

Позже некоторые элементы будут заменены, удалены или будут добавлены новые.
Таким образом, myArray[(myArray.length)-1] будет другим элементом, чем раньше.

И на данный момент это не работает. Новый элемент не будет прослушивать мои события нажатия. Есть ли какой-либо способ «обновить» это событие onclick?


Как и просили, вот упрощенная версия html, она находится в:

 <div id="track-1">

<div class="coach">

<div class="my-element">
</div>

<div class="my-element">
</div>

</div>

(... some more coaches, the amount varies ...)


<div class="coach">

<div class="my-element">
</div>

<div class="my-element">
</div>

</div>

</div>
  

Ответ №1:

Вместо этого вы можете использовать делегирование событий и использовать getElementsByClassName , который возвращает live HTMLCollection. При нажатии проверьте, является ли целевой элемент последним элементом в коллекции:

 const elements = document.getElementsByClassName("my-element");
document.addEventListener('click', ({ target }) => {
  if (elements[elements.length - 1].contains(target)) {
    console.log('last element clicked');
  }
});
  

 setInterval(() => { document.body.insertAdjacentHTML('beforeend', '<div class="my-element">click</div>') }, 2000);


const elements = document.getElementsByClassName("my-element");
document.addEventListener('click', ({ target }) => {
  if (elements[elements.length - 1].contains(target)) {
    console.log('last element clicked');
  }
});  

Вероятно, можно было бы найти более элегантное решение, учитывая HTML.

Комментарии:

1. Большое вам спасибо, работает идеально 🙂 Я добавил упрощенную версию HTML в свой startpost.