Обработчик событий не достигнут

# #javascript #html #firebase #web #events

Вопрос:

Я не могу добавить прослушиватель событий к значкам кнопок с помощью класса projEdit. Я бы отображал новую «страницу» при каждом нажатии кнопки редактирования, чтобы пользователь мог добавлять задачи в проекты. Проблема в том, что код не достигает функции обработчика. Кнопка правильно печатается в консоли, поэтому я знаю, что нацелен на нужный элемент.

HTML:

 <span>Sample Title</span>
<button class="projEdit"><span> <i class="fas fa-edit"></i></span></button>
<button class="projDel"><span><i class="fas fa-trash-alt"></i></span></button>
 

JS для отображения нового проекта: displayProject.js

 function getProjectHtml(title) {
    const str = `<h2><span>${title}</span>
    <button class="projEdit"><span> <i class="fas fa-edit"></i></span></button>
    <button class="projDel"><span><i class="fas fa-trash-alt"></i></span></button></h2>`
    return str;
}
export default function displayProject(docRef) {
    docRef.onSnapshot((snapshot) => {
        snapshot.docChanges().forEach((change) => {
            if (change.type == "added") {
                const projectsDescription = document.getElementById('projectsDescription');
                let project = document.createElement('div');
                project.innerHTML = getProjectHtml(change.doc.data().title);
                projectsDescription.appendChild(project);
            }
        })
    });
}
 

Багги JS — чтобы добавить прослушиватель событий к значку кнопки редактирования: saveProject.js

 function editTheProject() {
    console.log('hi'); // NOT REACHED 
}

function activateEditBtn() {
    const btn = document.querySelector('#projectsDescription > *:last-child .projEdit');
    console.log(btn); // This Is Fine!
    btn.addEventListener('click', editTheProject);
}

function saveProjectFunctionality() {
    // Step 1 - add project to DB
    const project = getProject();
    addProjectToDB(project);
    // Step 2 - Close the Modal  -  LEFT

    // Step 3 - Add event listener to the Edit button 
    activateEditBtn();

}

export default function saveProject() {
    const saveProjectBtn = document.getElementById('saveProjectBtn');
    saveProjectBtn.addEventListener('click', saveProjectFunctionality);
}
 

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

1. У вас есть несколько кнопок с классом projEdit (для нескольких элементов)? querySelector выберите первый элемент. И если да, то вы, вероятно, никогда не тестировали первую кнопку?

2. @SvenEberth Да. Я только что понял, что прослушиватель событий добавляется ко второму последнему элементу, как это исправить?

Ответ №1:

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

Ты можешь сделать это вот так:

 function activateEditBtn() {
    document.querySelectorAll('#projectsDescription .projEdit').forEach(btn => {
        console.log(btn);
        btn.addEventListener('click', editTheProject);
    });
}
 

В противном случае вы добавляете слушателя только к первому.

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

1. Но это будет не в прямом эфире… Мне придется просматривать весь список каждый раз, когда я добавляю новый проект.

2. Извините за поздний ответ. Вам необходимо предоставить более подробную информацию о своем коде и о том, с какими проблемами вы сталкиваетесь, чтобы добавить обработчики событий ко всем кнопкам. Я не знаю всего вашего кода, поэтому я не знаю, когда saveProject вызывается или добавляется новый проект.