В этом руководстве вы узнаете разницу между innerHTML и createElement() в JavaScript, когда дело доходит до создания новых элементов в дереве DOM.
1) createElement более эффективен
Предположим, что у вас есть элемент div с контейнером класса:
<div class="container"></div>
Вы можете добавить новые элементы в элемент div, создав элемент и добавив его:
let div = document.querySelector('.container');
let p = document.createElement('p');
p.textContent = 'JS DOM';
div.appendChild(p);Вы также можете манипулировать HTML-кодом элемента напрямую, используя innerHTML следующим образом:
let div = document.querySelector('.container');
div.innerHTML += '<p>JS DOM</p>';Использование innerHTML чище и короче, если вы хотите добавить атрибуты к элементу:
let div = document.querySelector('.container');
div.innerHTML += '<p class="note">JS DOM</p>';Однако использование innerHTML заставляет веб-браузеры повторно анализировать и воссоздавать все узлы DOM внутри элемента div. Следовательно, это менее эффективно, чем создание нового элемента и добавление его в div. Другими словами, создание нового элемента и добавление его в дерево DOM обеспечивает лучшую производительность, чем innerHTML.
2) createElement более безопасен
Как упоминалось в руководстве по innerHTML, вы должны использовать его только тогда, когда данные поступают из надежного источника, такого, как база данных.
Если вы установите содержимое, над которым у вас нет контроля для innerHTML, вредоносный код может быть внедрен и выполнен.
3) Использование DocumentFragment для создания узлов DOM
Предполагая, что у вас есть список элементов, и вам нужно на каждой итерации:
let div = document.querySelector('.container');
for(let i = 0; i < 1000; i++) {
let p = document.createElement('p');
p.textContent = `Paragraph ${i}`;
div.appendChild(p);
}Этот код приводит к пересчету стилей, рисунков и макетов на каждой итерации. Это не очень эффективно.
Чтобы преодолеть это, вы обычно используете DocumentFragment для создания узлов DOM и добавления их к дереву DOM:
let div = document.querySelector('.container');
// compose DOM nodes
let fragment = document.createDocumentFragment();
for(let i = 0; i < 1000; i++) {
let p = document.createElement('p');
p.textContent = `Paragraph ${i}`;
fragment.appendChild(p);
}
// append the fragment to the DOM tree
div.appendChild(fragment);В этом примере мы составили узлы DOM, используя объект DocumentFragment, и один раз в конце добавили фрагмент к активному дереву DOM.
Фрагмент документа не связан с активным DOM-деревом, поэтому не влияет на производительность.
