Видалити всі дочірні вузли з батьків?


79

У мене є список, я просто хочу видалити з нього всі дочірні вузли. Який найефективніший спосіб використання jquery? Це те, що я маю:

<ul id='foo'>
  <li>a</li>
  <li>b</li>
</ul>

var thelist = document.getElementById("foo");   
while (thelist.hasChildNodes()){
    thelist.removeChild(thelist.lastChild);
}

чи існує ярлик, а не видалення кожного елемента, по одному?

----------- Редагувати ----------------

До кожного елемента списку додаються деякі дані, і обробник клацань, такий:

$('#foo').delegate('li', 'click', function() {
    alert('hi!');
});

// adds element to the list at runtime
function addListElement() {
    var element = $('<li>hi</hi>');
    element.data('grade', new Grade());
}

врешті-решт я міг би також додати кнопки для кожного елемента списку - так, схоже, це пустий () шлях, щоб переконатися, що немає витоків пам'яті?


Які ефективні в які терміни? Продуктивність, читабельність?
Гамбо,

Додаючи до запитань @ Gumbo, наскільки турбує також пам’ять? Чи пов’язані ці елементи з обробниками подій?
Нік Кравер

З огляду на оновлену відповідь, так .empty()було б, щоб очистити дані, $.cacheщо element.data('grade', new Grade());додаються.
Нік Кравер

Так, дані пов’язані, і можуть бути врешті-решт пов’язані обробники подій (зараз я просто використовую делегат для всіх елементів).
user246114

@NickCraver Я просто плюю тут, але навіть використовуючи JS, ти можеш це зробитиtheList.innerHTML=""
Джон Строуд

Відповіді:


185

Ви можете використовувати .empty(), як це :

$("#foo").empty();

З документів :

Видаліть усі дочірні вузли набору відповідних елементів із DOM.


6
Також варто зазначити (з документів) Щоб уникнути витоків пам'яті, jQuery видаляє інші конструкції, такі як обробники даних та подій, з дочірніх елементів перед тим, як видаляти самі елементи.
user113716

1
@patrick - +1, ще одна причина пройти цей шлях через часто рекомендовані .html(''), оскільки дані взагалі не зберігаються на елементі, багато людей забувають про витік, який спричиняє.
Нік Кравер

1
+1 Також, якщо ви впевнені, жодні події не пов’язані з дітьми батьків, $("#foo")[0].innerHTML="";буде швидшим. Тільки будьте обережні, щоб не спричиняти витоків пам’яті, виконуючи видалення елементів таким чином ( empty()вже дуже уважно ставитесь до того, щоб цього не сталося, особливо в IE).
Девід Мердок,

@David - Події можуть бути проблемою у всіх браузерах, але добре, IE має інші проблеми з пам'яттю, багато з них. Оскільки події насправді зберігаються $.cacheразом із рештою всього, що є в даних, він не буде видалений за допомогою викликів налаштування html.
Нік Крейвер

1
Добре оновлене запитання, так, у мене є деякі дані, пов'язані з кожним елементом, тому схоже, що empty () - це шлях.
user246114

5

Інші користувачі запропонували,

.empty()

достатньо, оскільки він видаляє всі нащадні вузли (як вузли тегів, так і текстові) І всі види даних, що зберігаються в цих вузлах. Дивіться порожню документацію щодо API JQuery .

Якщо ви хочете зберегти дані, наприклад, обробники подій, вам слід скористатися

.detach()

як описано в документації щодо відключення API JQuery .

Метод .remove () може бути корисним для подібних цілей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.