JavaScript DocumentFragment — вставка без зайвих перемальовувань
DocumentFragment — легкий контейнер поза документом: у ньому збирають вузли, а потім вставляють у сторінку одним рухом.
Загальний опис
Кожна вставка в живий DOM може змусити браузер перерахувати макет. Додаєш сотню рядків у цикл — платиш за це сто разів.
Фрагмент існує поза документом, тож жодна операція в ньому нічого не перемальовує. А коли він вставляється у сторінку, всередину переїжджають лише його діти — сам фрагмент зникає, зайвої обгортки в розмітці не з'являється.
Отже: один перерахунок замість ста.
Його ж повертає <template>: template.content — це і є DocumentFragment із готовою розміткою, яку лишається клонувати.
- Порада
-
Сучасні браузери й самі непогано групують зміни, тож на десятку вузлів різниці не побачиш. А от на сотнях і тисячах — побачиш добре.
автор: NagarD
Синтаксис
const frag = document.createDocumentFragment();
методи
| Метод | Опис |
|---|---|
| append | Додає вузли чи текст у кінець. |
| prepend | Додає вузли чи текст на початок. |
| querySelector | Перший нащадок за CSS-селектором. |
| querySelectorAll | Усі нащадки за CSS-селектором. |
| getElementById | Нащадок за id. |
властивості
| Властивість | Опис |
|---|---|
| children | Дочірні елементи фрагмента. |
| firstElementChild | Перший дочірній елемент. |
| childElementCount | Кількість дочірніх елементів. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| DocumentFragment | 1+ | 1+ | 1+ | 7+ | 12+ | 9+ |
| Переглядач | ||||
|---|---|---|---|---|
| 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
Коментарі
Коментарів ще немає — будьте першим!