javascript-tutorial / ru.javascript.info

Современный учебник JavaScript

Home Page:https://learn.javascript.ru

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Вводящая в заблуждение информация

Konstantine-Nevzhunskyi opened this issue · comments

https://learn.javascript.ru/modifying-document#ustarevshie-metody-vstavki-udaleniya
"Сейчас уже нет причин их использовать, так как современные методы append, prepend, before, after, remove, replaceWith более гибкие и удобные." – неверно, ведь при использовании appendChild (в отличии от append) не удаляются eventListener'ы на вставляемом элементе. Вообще, не хватает информации о влиянии методов редактирования на слушатели событий.

неверно, ведь при использовании appendChild (в отличии от append) не удаляются eventListener'ы на вставляемом элементе.

На какой источник информации вы ссылаетесь? Где об этом сказано? В MDN, к примеру, об этом ни слова не говорится.

Простейший пример, доказывающий, что это не так:

let element = document.createElement("p"); // создаём новый элемент <p>
element.setAttribute("id", "p_element") // ...с ID "p_element"
element.innerHTML = "элемент p"; // ...указываем контент <p id="p_element">элемент p</p>

element.addEventListener("click", () => alert(0)); // при клике на p_element должен появиться alert с надписью "0"

document.getElementById("content")
  .append(element); // добавляем созданный элемент <p> к любому другому элементу 

Как итог — alert прекрасно срабатывает при нажатии на надпись "элемент p".

Можно также проверить наличие eventListener'a на элементе <p id="p_element">...</p> с помощью встроенной функции getEventListeners(domElement) (поддерживается только в Developer Tools Console в браузерах Chrome, Safari и Vivaldi):

getEventListeners(
  document.getElementById("p_element")
);

/*
{
    "click": [
        {
            "useCapture": false,
            "passive": false,
            "once": false,
            "type": "click"
        }
    ]
}
*/

// в случае, если бы на p_element не было eventListener'ов, функция getEventListeners() вернула бы {}

Да, вы правы. Не могу повторить.