Как мне удалить все дочерние элементы узла DOM в JavaScript?
Скажем, у меня есть следующий (безобразный) HTML:
<p id="foo">
<span>hello</span>
<div>world</div>
</p>
И я беру узел, который я хочу, вот так:
var myNode = document.getElementById("foo");
Как я мог удалить детей foo
так, чтобы просто <p id="foo"></p>
осталось?
Могу ли я просто сделать:
myNode.childNodes = new Array();
или я должен использовать какую-то комбинацию removeElement
?
Я хотел бы, чтобы ответ был прямым DOM; хотя дополнительные баллы, если вы также предоставляете ответ в jQuery вместе с ответом только для DOM.
javascript
dom
Polaris878
источник
источник
innerHTML = ''
медленнее, но я не думаю, что это «неправильно». Любые утверждения об утечках памяти должны быть подтверждены доказательствами.В настоящее время принят неправильный ответ о том,
innerHTML
что он медленнее (по крайней мере, в IE и Chrome), как правильно заметил m93a.Chrome и FF значительно быстрее, используя этот метод (который уничтожит прикрепленные данные jquery):
в отдаленную секунду для FF и Chrome, и самый быстрый в IE:
InnerHTML не разрушит ваши обработчики событий и не нарушит ссылки на jquery , также рекомендуется в качестве решения здесь: https://developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML .
Самый быстрый метод манипулирования DOM (все еще медленнее, чем предыдущие два) - это удаление Range, но диапазоны не поддерживаются до IE9.
Другие упомянутые методы кажутся сопоставимыми, но намного медленнее, чем innerHTML, за исключением выброса jquery (1.1.1 и 3.1.1), который значительно медленнее, чем что-либо еще:
Доказательства здесь:
http://jsperf.com/innerhtml-vs-removechild/167http://jsperf.com/innerhtml-vs-removechild/300https://jsperf.com/remove-all-child-elements-of-a- дом-узел-в-JavaScript (новый URL для перезагрузки jsperf, потому что редактирование старого URL не работает)«Цикл за тест» в Jsperf часто понимается как «за итерацию», и только у первой итерации есть узлы для удаления, поэтому результаты не имеют смысла, на момент публикации в этом потоке были неправильно настроены тесты.
источник
jQuery.cache
, что приведет к утечке памяти, поскольку единственная доступная ссылка для управления этими данными была на элементах, которые вы только что уничтожили.cloneNode
отключает контейнер, что означает, что ссылки на контейнер не поддерживаются (jquery или иным образом). Кэш Jquery может позволить использовать jquery для удаления элементов, если к ним прикреплены данные jquery. Надеюсь, они переключатся на WeakMaps в какой-то момент. Очистка (или даже существование) $ .cache официально не документирована.Используйте современный Javascript, с
remove
!Это более новый способ записи удаления узла в ES5. Это ванильный JS и много читает лучше, чем предыдущие версии.
Большинство пользователей должны иметь современные браузеры, или вы можете перейти вниз, если это необходимо.
Поддержка браузеров - 95% декабрь 2019
источник
while (parent.firstChild) { parent.removeChild(parent.firstChild); }
петлю. developer.mozilla.org/en-US/docs/Web/API/ParentNode/children developer.mozilla.org/en-US/docs/Web/API/Node/childNodeswhile (parent.firstChild && !parent.firstChild.remove());
[...parent.childNodes].forEach(el => el.remove());
while (selectElem.firstElementChild) { selectElem.firstElementChild.remove(); }
Если есть вероятность, что у вас есть потомки, затронутые jQuery, вы должны использовать какой-то метод, который очистит данные jQuery.
JQuery
.empty()
метод гарантирует , что любые данные , которые JQuery , связанные с элементами удаляются будут очищены.Если вы просто используете
DOM
методы удаления детей, эти данные останутся.источник
while ( myNode.firstChild ) {
while(fc = myNode.firstChild){ myNode.removeChild(fc); }
Если вы используете jQuery:
Если вы этого не сделаете:
источник
Быстрейший...
Спасибо Андрею Лушникову за ссылку на jsperf.com (классный сайт!).
РЕДАКТИРОВАТЬ: чтобы быть ясным, нет никакой разницы в производительности в Chrome между firstChild и lastChild. Верхний ответ показывает хорошее решение для производительности.
источник
Если вы хотите иметь только узел без его дочерних элементов, вы также можете сделать его копию следующим образом:
Зависит от того, что вы пытаетесь достичь.
источник
parent.replaceChild(cloned, original)
? Это может быть быстрее, чем удаление дочерних элементов по одному, и должно работать на всем, что поддерживает DOM (то есть на всех типах XML-документов, включая SVG). Установка innerHTML также может быть быстрее, чем удаление дочерних элементов один за другим, но это не работает ни с чем, кроме документов HTML. Следует проверить это через некоторое время.addEventListener
.Вот еще один подход:
источник
Это как innerText, кроме стандартного. Это немного медленнее, чем
removeChild()
, но проще в использовании и не будет иметь большого значения для производительности, если у вас нет слишком много материала для удаления.источник
В ответ на DanMan, Мартен и Мэтт. Клонирование узла для установки текста действительно является жизнеспособным способом в моих результатах.
Также это работает для узлов, не входящих в dom, которые возвращают ноль при попытке доступа к parentNode. Кроме того, если вам нужно быть в безопасности, перед добавлением контента узел пуст, это действительно полезно. Рассмотрим вариант использования внизу.
Я считаю этот метод очень полезным при замене строки внутри элемента, если вы не уверены, что будет содержать этот узел, вместо того, чтобы беспокоиться о том, как убрать беспорядок, начните сначала.
источник
Вот что я обычно делаю:
И вуаля, позже вы можете очистить любой элемент DOM с помощью:
источник
domEl.innerHTML = ""
плохая и считается плохой практикойДля этого есть несколько вариантов:
Быстрейший ():
Альтернативы (медленнее):
Бенчмарк с предложенными опциями
источник
Это удалит все узлы в элементе.
источник
innerText - победитель! http://jsperf.com/innerhtml-vs-removechild/133 . Во всех предыдущих тестах внутренний dom родительского узла удалялся на первой итерации, а затем innerHTML или removeChild, где применялся к пустому div.
источник
innerText
это запатентованная вещь MS, хотя. Просто говорю.box
что он доступен не как var, а через DOM-поиск на основе id, и посколькуwhile
цикл делает этот медленный вызов много раз, он штрафуется.Самый простой способ удаления дочерних узлов узла через Javascript
источник
я видел, как люди делают:
тогда кто-то сказал, используя
el.lastNode
быстрееОднако я думаю, что это самый быстрый:
что вы думаете?
PS: эта тема была спасением для меня. мой аддон Firefox был отклонен, потому что я использовал innerHTML. Это стало привычкой в течение длительного времени. тогда я осуждаю это. и я на самом деле заметил разницу в скорости. при загрузке innerhtml потребовалось некоторое время, чтобы обновиться, однако, благодаря addElement, его моментально!
источник
for (var i=0...
один, хотя. Но вот что я получил, запустив эти тесты: i.imgur.com/Mn61AmI.png, поэтому в этих трех тестах firstNode был быстрее, чем lastNode и innerHTML, что действительно здоровоИспользование цикла диапазона кажется мне наиболее естественным:
Согласно моим измерениям в Chrome и Firefox, он примерно в 1,3 раза медленнее. В обычных условиях это, возможно, не будет иметь значения.
источник
источник
Как правило, JavaScript использует массивы для ссылки на списки узлов DOM. Таким образом, это будет хорошо работать, если вы заинтересованы в этом через массив HTMLElements. Кроме того, стоит отметить, потому что я использую ссылку на массив вместо прототипа JavaScript, это должно работать в любом браузере, включая IE.
источник
Почему мы не следуем простейшему методу «удалить», зацикленному внутри while.
источник
Просто видел, как кто-то упомянул этот вопрос в другом, и подумал, что я добавлю метод, которого я еще не видел:
Функция clear берет элемент и использует родительский узел для замены себя копией без дочерних элементов. Небольшой выигрыш в производительности, если элемент редкий, но когда элемент имеет несколько узлов, выигрыш в производительности реализуется.
источник
Функциональный подход:
«childNodes» в domChildren выдаст нодлист из ближайших дочерних элементов, который пуст, когда ничего не найдено. Чтобы отобразить нодлист, domChildren преобразует его в массив. domEmpty отображает функцию domRemove на все элементы, которая удаляет ее.
Пример использования:
удаляет всех детей из элемента тела.
источник
Другие способы в jQuery
источник
.empty()
метод, просто$("#foo").empty()
было бы достаточнопросто только IE:
true
- означает сделать глубокое удаление - что означает, что все дети также удаленыисточник
Самый простой способ:
источник
container.innerHTML = null
что Internet Explorer отобразит текстnull
. Таким образом, это не действительно удаляет детей, я бы сказал.простое и быстрое использование для цикла !!
это не будет работать в
<span>
теге!источник
<span>
тегЕсли вы хотите что-то вложить в это
div
,innerHTML
вероятно, лучше.Мой пример:
Если я использую метод
.firstChild
или, функция не работает впоследствии, но нет проблем с методом..lastChild
displayHTML()
.innerHTML
источник
Это чистый JavaScript, я не использую jQuery, но работает во всех браузерах, даже в IE, и он очень прост для понимания
источник
с помощью jQuery:
источник
$('#foo').children().remove()
гораздо логичнее