2010-06-15 8 views
63

У меня есть список, я просто хочу удалить из него все дочерние узлы. Каков наиболее эффективный способ использования 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()); 
} 

в конце концов, я мог бы добавить кнопки для каждого списка пункт тоже - так он выглядит пустым() является путь, чтобы убедиться, что нет утечек памяти?

+0

Эффективно в каких условиях? Производительность, читаемость? – Gumbo

+0

Добавляя к вопросам @ Gumbo, насколько важна память? Связаны ли эти элементы с обработчиками событий? –

+0

Учитывая обновленный ответ, да, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' удалял из '' .cache'' '' элемент.data ('grade', new Grade()); –

ответ

137

Вы можете использовать .empty(), как this:

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

From the docs:

Удалить все дочерние узлы набора соответствующих элементов из DOM.

+5

Также стоит отметить (из документов) * Чтобы избежать утечек памяти, jQuery удаляет из дочерних элементов другие конструкторы, такие как данные и обработчики событий, перед удалением самих элементов. * – user113716

+1

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

+1

+1 Кроме того, если вы уверены, что никаких событий не было связано с дочерними элементами родительского '$ (" # foo ") [0] .innerHTML =" ";' будет быстрее. Просто будьте осторожны, вы не вызываете утечек памяти при удалении элементов таким образом ('empty()' уже очень заботится, чтобы этого не произошло, особенно в IE). –

3

А другие пользователи предложили,

.empty() 

хорошо прийти, потому что она удаляет все узлы-потомки (оба тега-узлы и текстовые узлы) и все виды данных, которые хранятся внутри этих узлов. См. JQuery's API empty documentation.

Если вы хотите сохранить данные, как обработчики событий, например, вы должны использовать

.detach() 

, как описано на JQuery's API detach documentation.

Метод .remove() может быть полезен для аналогичных целей.

Смежные вопросы