Как правильно добавить событие с помощью addEventListener?

#javascript #dom #addeventlistener #dom-events

#javascript #dom #addeventlistener #dom-события

Вопрос:

Я пытаюсь добавить событие щелчка в элемент div, но это не работает.

Ссылка на js-файл находится под тегом body, поэтому элемент divContainer уже существует. Я попытался добавить div-элемент с помощью appendChild и добавить к нему событие в консоли браузера и ит-работника.

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

          function DatePicker(id, callback) {
    let monthNames = ["January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December"
    ];

    this.render = function (date) {
        let divContainer = document.getElementById(id);
        let selectedDay = date.getDay() !== 0? date.getDay() : 7;

        let prevMonth = new Date(date.getFullYear(), date.getMonth(), 1 - selectedDay);
        let month = new Date(date.getFullYear(), date.getMonth(), 1);
        let nextMonth = new Date(date.getFullYear(), date.getMonth()   1, 0);
        let firstDayInMonth = month.getDay() !== 0? month.getDay() : 7;
        let lastDayInMonth = nextMonth.getDay() !== 0? nextMonth.getDay() : 7;

        divContainer.innerHTML = '';
        divContainer.innerHTML  =
            '<div class="header"><div class="triangle-left" onclick="goPrev(this.parentElement)"></div>'  
            monthNames[date.getMonth()]   ' '   date.getFullYear()  '<div class="triangle-right" onclick="goNext(this.parentElement)"></div></div>';

        divContainer.innerHTML  =   '<div><a>Mon</a> <a>Tue</a> '  
                                    '<a>Wed</a> <a>Thu</a> <a>Fri</a>'  
                                    '<a>Sat</a> <a>Sun</a></div><hr>';

        for(let i = 0; i < firstDayInMonth - 1;   i)
        {
            divContainer.innerHTML  = '<div class="anotherMonth"  onclick="goPrev(this)">' (prevMonth.getDate()   1   i) '</div>';
        }
        for(let i = 0; i < nextMonth.getDate();   i)
        {
            if((i 1) === date.getDate()) {
                let div = document.createElement('div');
                div.classList.add('selectedDate');
                div.innerText = 1 i;
                divContainer.appendChild(div);
                div.addEventListener("click", function(){ alert("Hello World!");});
            }
            else {
                let div = document.createElement('div');
                div.classList.add('currentMonth');
                div.innerText = 1 i;
                divContainer.appendChild(div);
                div.addEventListener("click", function(){ alert("Hello World!"); });
            }
        }
        for(let i = 0; i < 7 - lastDayInMonth;   i)
        {
            divContainer.innerHTML  = '<div class="anotherMonth"  onclick="goNext(this)">' (1   i) '</div>';
        }
    };
}
 

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

1. попробуй document.getElementById('existing_id')

2. Где id объявлено?

Ответ №1:

Пока вы передаете действительный id into .getElementById() и этот элемент уже был проанализирован в DOM, код будет работать:

 // You must pass a string with a valid id
let divContainer = document.getElementById("container"); 
for(let i = 0; i < 10;   i) {
  let div = document.createElement('div');
  div.classList.add('selectedDate');
  div.textContent = 1 i;  // Use textContent. innerText is non-standard
  div.addEventListener("click", function(){ alert("Hello World!"); });
  divContainer.appendChild(div);  // Append last for better performance in many cases
} 
 <div id="container"></div> 

Ответ №2:

Ваш код при ссылке на существующий элемент работает просто отлично:

 let divContainer = document.getElementById('existing');
for(let i = 0; i < 10;   i)
{
  let div = document.createElement('div');
  div.classList.add('selectedDate');
  div.innerText = 1 i;
  divContainer.appendChild(div);
  div.addEventListener("click", function(){ alert("Hello World!"); });
} 
 <div id="existing"></div> 

Но лучше всего использовать только click обработчики <button> <a> и <input> элементы, чтобы улучшить способность программы чтения с экрана корректно работать с вашим сайтом.