Делегирование событий
Вешаете один listener на родителя (ul), а не на каждый li. По event.target находите элемент строки и удаляете его.
<ul id="list">
<li>A <button data-action="remove">×</button></li>
<li>B <button data-action="remove">×</button></li>
</ul>
list.addEventListener('click', (e) => {
const btn = e.target.closest('[data-action="remove"]');
if (!btn || !list.contains(btn)) return;
btn.closest('li')?.remove();
});
Почему так лучше
- меньше слушателей → меньше памяти;
- новые
li, добавленные позже, уже «подхвачены»;
- один путь обработки ошибок и аналитики.
Нюансы
Проверяйте, что клик внутри списка (closest + contains). Для клавиатуры — кнопки, не только div с кликом.