JavaScript DocumentFragment — вставка без зайвих перемальовувань


DocumentFragmentлегкий контейнер поза документом: у ньому збирають вузли, а потім вставляють у сторінку одним рухом.

автор: NagarD

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

Кожна вставка в живий DOM може змусити браузер перерахувати макет. Додаєш сотню рядків у цикл — платиш за це сто разів.

Фрагмент існує поза документом, тож жодна операція в ньому нічого не перемальовує. А коли він вставляється у сторінку, всередину переїжджають лише його діти — сам фрагмент зникає, зайвої обгортки в розмітці не з'являється.

Отже: один перерахунок замість ста.

Його ж повертає <template>: template.content — це і є DocumentFragment із готовою розміткою, яку лишається клонувати.

автор: NagarD

Порада

Сучасні браузери й самі непогано групують зміни, тож на десятку вузлів різниці не побачиш. А от на сотнях і тисячах — побачиш добре.

автор: NagarD

Синтаксис

const frag = document.createDocumentFragment();

методи

Метод Опис
append Додає вузли чи текст у кінець.
prepend Додає вузли чи текст на початок.
querySelector Перший нащадок за CSS-селектором.
querySelectorAll Усі нащадки за CSS-селектором.
getElementById Нащадок за id.

властивості

Властивість Опис
children Дочірні елементи фрагмента.
firstElementChild Перший дочірній елемент.
childElementCount Кількість дочірніх елементів.

Переглядачі

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

Приклади

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

Сотня рядків — один перерахунок макета замість ста.

HTML

<ul id="list"></ul>

JS

const fragment = document.createDocumentFragment();

for (let i = 1; i <= 100; i++) {
    const item = document.createElement('li');
    item.textContent = 'Рядок ' + i;
    // це поза документом — жодного перемальовування
    fragment.append(item);
}

// одна вставка — один перерахунок
document.getElementById('list').append(fragment);

// після вставки фрагмент порожній: діти переїхали
console.log(fragment.childNodes.length); // 0
автор: NagarD

Коментарі

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

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

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

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

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

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

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

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

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

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

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