Как установить событие для элементов, до добавления в DOM?

Привет!
Собственно , вопрос в названии... Есть код
let notificationsElementContainer = document.createElement("div");
notificationsElementContainer.addEventListener("click", function () {
                    console.log("clicked");
                });

и т.д. После чего элемент добавляется в DOM. Но при клике на элемент, обработчик не запускается. В какую сторону копать?

Полный код метода:
this.view.clear();
        let documentFragment = [];
        let el;
        this.clients.forEach(function (client, i) {
            let j = i + 1;
            el = document.createElement("div");
            el.className = "list-group-item client-list-item " + client.warningLevel;
            el.id = "ind_" + j;
            el.title = client.id;
            el.dataset.id = client['id'];
            el.dataset.index = j;
            if (j % 2 == 0) {
                el.classList.add("event");
            }

            let firstColumn = document.createElement("span");
            firstColumn.innerText = j.toString();
            el.appendChild(firstColumn);

            let secondColumn = document.createElement("span");
            secondColumn.innerText = client.name;

            if (client.notifications.length > 0) {
                let notifications = "";
                client.notifications.forEach(function (value) {
                    notifications = notifications.length == 0 ? (" - " + value + "!") : (notifications + "<br>" + " - " + value + "!");
                });

                let notificationsElementContainer = document.createElement("div");
                
                notificationsElementContainer.addEventListener("click", function () {//Так не работает
                    console.log("clicked");
                });
                notificationsElementContainer.classList.add("client-notifications");
                notificationsElementContainer.setAttribute("onclick", "MARWA.Plug()"); // Так работает, но это уже кривое решение

                let notificationsElement = document.createElement("i");
                notificationsElement.dataset["container"] = "body";
                notificationsElement.dataset["toggle"] = "popover";
                notificationsElement.dataset["placement"] = "right";
                notificationsElement.dataset["content"] = notifications;
                notificationsElement.dataset["originalTitle"] = "<div>Уведомления... " +
                    "<button class='pull-right btn btn-xs btn-link'><i class='fa fa-times'></i></button>" +
                    "</div>";
                notificationsElement.className = "fa fa-exclamation-triangle";

                notificationsElementContainer.appendChild(notificationsElement);

                secondColumn.appendChild(notificationsElementContainer);
            }
            el.appendChild(secondColumn);
            documentFragment.push(el.outerHTML);
        }, this);

        this.view.append(documentFragment);
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
Ivanq
@Ivanq
Знаю php, js, html, css
Из-за el.outerHTML сохраняются только тег и аттрибуты, а события теряются - именно поэтому его не люблю.

Тогда вместо documentFragment.push(el.outerHTML); будет documentFragment.appendChild(el);, а вместо let documentFragment = []; - let documentFragment = document.createFragment();

Типа того.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы