Обновление
На 5% быстрее, чем ВСЕ примеры
(включая принятый ответ)
Следующий пример взят из Range API :
const rng = document.createRange();
rng.selectNodeContents(document.querySelector('ul'));
rng.deleteContents();
интерфейс Range работает с фрагментами документа, которые содержат узлы и текст.Хотя выглядит медленным , на самом деле это быстро и 100% совместимо со всеми браузерами .
Методы диапазона
.createRange()
.selectNodeContents()
.deleteContents()
15% медленнее, чем все примеры
Эта комбинация быстрее, чем большинство примеров, и менее многословна (за исключением демонстрации Range , являющейся самой быстрой.)
document.querySelector('ul').replaceWith(document.createElement('ul'));
Это 2 взаимодействия DOM:Найдите список и замените его пустым списком.См. Демонстрацию 1. Если вы хотите поддерживать IE11 (глобальная доля ATM 2,26%) , не используйте его.
Демо 1
Range API
const rng = document.createRange();
rng.selectNodeContents(document.querySelector('ul'));
rng.deleteContents();
ul {
min-height: 30px;
min-width: 30px;
outline: 1px dashed red;
}
<ul>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
</ul>
Демо 2
.replaceWith()
и .createElement()
document.querySelector('ul').replaceWith(document.createElement('ul'));
ul {
min-height: 30px;
min-width: 30px;
outline: 1px dashed red;
}
<ul>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
</ul>
@ 50% медленнее, чем все примеры
Лучший способ оптимизировать любые манипуляции с DOM - это не иметь их.Держите доступ DOM к минимуму - это очень много времени.Каждый раз, когда механизм JS ищет элемент, он будет проходить по дереву DOM, каждый раз, когда тег добавляется или удаляется, узлы (элемент, текст и т. Д.), Которые уже находятся в DOM, должны пересчитываться для определения местоположения и размеров, чтобы дажеесли количество задействованных узлов всего несколько, это может привести к исключительно длительному процессу для браузера.Это называется reflow, а похожая проблема, связанная со стилями CSS, называется перерисовкой.
Следующая демонстрация удаляет все
<li>
в
<ul>
с 4 операциями DOM:
Ссылка на <ul>
- 1 поиск
Ссылочный родительский элемент <ul>
добавляет пустой <ul>
- 1 поиск, 1 добавление
Создать documentFragment
и добавить к нему оригинал <ul>
- 1 удаление
.insertAdjacentHTML()
рендеринг неразрушающим образом htmlString
в HTML и он высоко оптимизирован .
.createDocumentFragment()
никогда не касается DOM и все, что к нему прикреплено, больше не касается DOM.
Демонстрация 3
.insertAdjacentHTML
и .createDocumentFragment()
// Reference the <ul>
const list = document.querySelector('ul');
// Reference parent of <ul> append an empty <ul>
list.parentElement.insertAdjacentHTML('beforeend', `<ul></ul>`);
// Create a document fragment and append original <ul> to it
document.createDocumentFragment().appendChild(list);
ul {
min-height: 30px;
min-width: 30px;
outline: 1px dashed red;
}
<ul>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
<li>ITEM</li>
</ul>