Xóa tất cả các nút con khỏi nút cha?


79

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 sử dụng jquery hiệu quả nhất là gì? Đây là những gì tôi có:

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

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

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

----------- Biên tập ----------------

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

$('#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ũng có thể thêm các nút cho mỗi mục danh sách - vì vậy có vẻ như trống () là cách để thực hiện, để đảm bảo không có rò rỉ bộ nhớ?


Hiệu quả trong điều kiện nào? Hiệu suất, khả năng đọc?
Gumbo

Thêm vào câu hỏi của @ Gumbo, có bao nhiêu mối quan tâm là bộ nhớ? Các mục này có ràng buộc trình xử lý sự kiện không?
Nick Craver

Với câu trả lời được cập nhật, có .empty()sẽ là cách để đi, để xóa dữ liệu trong số $.cacheđó element.data('grade', new Grade());thêm vào.
Nick Craver

Vâng, có ràng buộc dữ liệu và cuối cùng có thể có các trình xử lý sự kiện bị ràng buộc (hiện tại tôi chỉ đang sử dụng một đại biểu cho tất cả các mục).
dùng246114

@NickCraver Tôi chỉ spitballing ở đây, nhưng thậm chí sử dụng JS, bạn có thể làmtheList.innerHTML=""
John Strood

Câu trả lời:


185

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

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

Từ các tài liệu :

Xóa tất cả các nút con của tập hợp các phần tử đã so khớp khỏi DOM.


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

1
@patrick - +1, một lý do khác để đi theo con đường này theo cách thường được khuyến nghị .html(''), vì dữ liệu không được lưu trữ trên phần tử khiến nhiều người quên mất nguyên nhân gây ra rò rỉ.
Nick Craver

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ái của cha mẹ $("#foo")[0].innerHTML="";sẽ nhanh hơn. Chỉ cần cẩn thận, bạn sẽ không gây ra bất kỳ rò rỉ bộ nhớ nào khi thực hiện xóa 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).
David Murdoch

@David - Các sự kiện sẽ là một vấn đề trong tất cả các trình duyệt, nhưng điểm tốt, IE có các vấn đề bộ nhớ khác, rất nhiều trong số đó. Vì các sự kiện thực sự được lưu trữ $.cachecùng với phần còn lại của bất kỳ thứ gì trong dữ liệu, nên nó sẽ không bị xóa với các lệnh gọi cài đặt html.
Nick Craver

1
Ok câu hỏi đã cập nhật, vâng, tôi có một số dữ liệu được liên kết với mỗi phần tử, vì vậy có vẻ như trống () là cách để thực hiện.
dùng246114

5

Một người dùng khác đã đề xuất,

.empty()

là điều nên làm, bởi vì nó loại bỏ tất cả các nút con (cả nút thẻ và nút văn bản) VÀ tất cả các loại dữ liệu được lưu trữ bên trong các nút đó. Xem tài liệu trống về API của JQuery .

Nếu bạn muốn giữ dữ liệu, chẳng hạn như trình xử lý sự kiện, bạn nên sử dụng

.detach()

như được mô tả trên tài liệu tách API của JQuery .

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.