2010-06-15 46 views
63

Tôi có một danh sách, tôi chỉ muốn xóa tất cả các nút con khỏi nó. Cách hiệu quả nhất khi sử dụng jquery là gì? Đây là những gì tôi có:Xóa tất cả các nút con khỏi cha/mẹ?

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

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

có lối tắt thay vì xóa từng mục, từng lần một?

----------- Chỉnh sửa ----------------

Mỗi phần tử danh sách có một số dữ liệu kèm theo và một trình xử lý nhấp chuột như thế này:

$('#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()); 
} 

cuối cùng tôi có thể thêm các nút cho mỗi mục trong danh sách quá - vì vậy nó trông giống như rỗng() là con đường để đi, để đảm bảo không có rò rỉ bộ nhớ?

+0

Hiệu quả theo thuật ngữ nào? Hiệu suất, khả năng đọc? – Gumbo

+0

Thêm vào câu hỏi của @ Gumbo, mức độ quan tâm của bộ nhớ là bao nhiêu? Những mục này có xử lý sự kiện bị ràng buộc không? –

+0

Với câu trả lời được cập nhật, có '.empty()' sẽ là cách để đi, để xóa dữ liệu ra khỏi '$ .cache' mà' element.data ('lớp', cấp mới()); 'thêm vào –

Trả lời

137

Bạn có thể sử dụng .empty(), như this:

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

From the docs:

Hủy bỏ tất cả các nút con của tập hợp các yếu tố phù hợp với từ DOM.

+5

Cũng đáng chú ý (từ tài liệu) * Để tránh rò rỉ bộ nhớ, jQuery loại bỏ các cấu trúc khác như xử lý dữ liệu và sự kiện từ các phần tử con trước khi xóa các phần tử. * – user113716

+1

@patrick - +1, một lý do khác để đi tuyến này thường được đề xuất '.html ('')', vì dữ liệu không được lưu trữ trên phần tử ở tất cả mọi người, hãy quên đi sự rò rỉ gây ra. –

+1

+1 Ngoài ra, nếu bạn chắc chắn không có sự kiện nào bị ràng buộc với con của cha mẹ '$ (" # foo ") [0] .innerHTML =" ";' sẽ nhanh hơn. Chỉ cần cẩn thận bạn không gây ra bất kỳ rò rỉ bộ nhớ nào khi thực hiện loại bỏ các phần tử theo cách này ('empty()' đã rất cẩn thận để đảm bảo điều này không xảy ra, đặc biệt là trong IE). –

3

Một người dùng khác đề nghị,

.empty() 

là tốt enought, bởi vì nó loại bỏ tất cả các nút hậu duệ (cả tag-nút và text-nút) VÀ tất cả các loại dữ liệu được lưu trữ bên trong các nút. Xem JQuery's API empty documentation.

Nếu bạn muốn giữ lại dữ liệu, như xử lý sự kiện ví dụ, bạn nên sử dụng

.detach() 

như mô tả trên JQuery's API detach documentation.

Phương thức .remove() có thể hữu ích cho các mục đích tương tự.

Các vấn đề liên quan