JavaScript cloneNode() — копія вузла DOM


Метод cloneNode() створює копію вузла. Аргумент true копіює його разом із усіма нащадками.

автор: NagarD

Загальний опис

Без аргументу копіюється лише сам вузол — порожній, без вмісту. Це майже ніколи не те, чого хочуть, тож cloneNode(true) зустрічається в рази частіше.

Найважливіше, про що забувають: обробники подій не копіюються. Клон виглядає точнісінько так само, але на кліки не реагує. Атрибути (включно з onclick у розмітці) переїжджають, а те, що навішено через addEventListener(), — ні.

Той самий підступ із id: він скопіюється, і на сторінці з'явиться два елементи з однаковим id — а це вже зламаний документ.

автор: NagarD

Нотатка

Клон не має обробників подій, зате має той самий id. Обидві речі доводиться виправляти вручну — саме тому для шаблонів беруть <template>.

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
cloneNode 1+ 1+ 1+ 7+ 12+ 9+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
cloneNode yes yes yes yes

Приклади

+ запропонувати свій приклад у пісочниці

Копія вузла: що переїде, а що ні.

HTML

<template id="row">
    <li class="item"><span></span></li>
</template>
<ul id="list"></ul>
<button id="demo-button">Оригінал з обробником</button>

JS

function onClick() {
    console.log('клік по оригіналу');
}

const button = document.getElementById('demo-button');

// класичний шаблон: клонуємо вміст <template>
const template = document.getElementById('row');
const clone = template.content.cloneNode(true);

clone.querySelector('span').textContent = 'Рядок';
document.getElementById('list').append(clone);

// пастка: обробники НЕ копіюються
button.addEventListener('click', onClick);
const copy = button.cloneNode(true);
// copy на кліки не реагує — обробник треба навісити заново

// і ще одна пастка: id скопіювався разом з усім
copy.removeAttribute('id');
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід